{
 "cells": [
  {
   "cell_type": "code",
   "execution_count": 1,
   "id": "a8a587c4",
   "metadata": {},
   "outputs": [],
   "source": [
    "import Modules.constants_external as constants \n",
    "import Modules.ds_loader as ds_loader\n",
    "from tensorflow import keras\n",
    "import numpy as np\n",
    "import os\n",
    "import sklearn\n",
    "import seaborn as sns\n",
    "import matplotlib.pyplot as plt\n",
    "from pathlib import Path\n",
    "import pandas as pd\n",
    "from signal_grad_cam import TfCamBuilder"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "id": "6eda83b8",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "500\n"
     ]
    }
   ],
   "source": [
    "print(constants.FINAL_SIZE)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "id": "2546888e",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "[ OK ] Loaded 10834 samples with shape (500, 12)\n",
      "(10834, 500, 12)\n",
      "(10834,)\n"
     ]
    }
   ],
   "source": [
    "X_test, y_test = ds_loader.load_data(constants.DATASET)\n",
    "print(X_test.shape)\n",
    "print(y_test.shape)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "id": "1c571041",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "(10834, 500, 12)\n"
     ]
    }
   ],
   "source": [
    "norm_X = []\n",
    "for x in X_test:\n",
    "    norm_x = (x - np.min(x)) / (np.max(x) - np.min(x))\n",
    "    norm_X.append(norm_x)\n",
    "\n",
    "norm_X = np.stack(norm_X, axis=0, dtype=np.float32)\n",
    "print(norm_X.shape)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "id": "aee46a5c",
   "metadata": {},
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "WARNING:absl:Compiled the loaded model, but the compiled metrics have yet to be built. `model.compile_metrics` will be empty until you train or evaluate the model.\n"
     ]
    },
    {
     "data": {
      "text/html": [
       "<pre style=\"white-space:pre;overflow-x:auto;line-height:normal;font-family:Menlo,'DejaVu Sans Mono',consolas,'Courier New',monospace\"><span style=\"font-weight: bold\">Model: \"functional\"</span>\n",
       "</pre>\n"
      ],
      "text/plain": [
       "\u001b[1mModel: \"functional\"\u001b[0m\n"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "text/html": [
       "<pre style=\"white-space:pre;overflow-x:auto;line-height:normal;font-family:Menlo,'DejaVu Sans Mono',consolas,'Courier New',monospace\">┏━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━┳━━━━━━━━━━━━━━━━━━━┓\n",
       "┃<span style=\"font-weight: bold\"> Layer (type)        </span>┃<span style=\"font-weight: bold\"> Output Shape      </span>┃<span style=\"font-weight: bold\">    Param # </span>┃<span style=\"font-weight: bold\"> Connected to      </span>┃\n",
       "┡━━━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━╇━━━━━━━━━━━━━━━━━━━┩\n",
       "│ input_layer         │ (<span style=\"color: #00d7ff; text-decoration-color: #00d7ff\">None</span>, <span style=\"color: #00af00; text-decoration-color: #00af00\">500</span>, <span style=\"color: #00af00; text-decoration-color: #00af00\">12</span>)   │          <span style=\"color: #00af00; text-decoration-color: #00af00\">0</span> │ -                 │\n",
       "│ (<span style=\"color: #0087ff; text-decoration-color: #0087ff\">InputLayer</span>)        │                   │            │                   │\n",
       "├─────────────────────┼───────────────────┼────────────┼───────────────────┤\n",
       "│ conv1d_1 (<span style=\"color: #0087ff; text-decoration-color: #0087ff\">Conv1D</span>)   │ (<span style=\"color: #00d7ff; text-decoration-color: #00d7ff\">None</span>, <span style=\"color: #00af00; text-decoration-color: #00af00\">500</span>, <span style=\"color: #00af00; text-decoration-color: #00af00\">128</span>)  │      <span style=\"color: #00af00; text-decoration-color: #00af00\">4,736</span> │ input_layer[<span style=\"color: #00af00; text-decoration-color: #00af00\">0</span>][<span style=\"color: #00af00; text-decoration-color: #00af00\">0</span>] │\n",
       "├─────────────────────┼───────────────────┼────────────┼───────────────────┤\n",
       "│ re_lu (<span style=\"color: #0087ff; text-decoration-color: #0087ff\">ReLU</span>)        │ (<span style=\"color: #00d7ff; text-decoration-color: #00d7ff\">None</span>, <span style=\"color: #00af00; text-decoration-color: #00af00\">500</span>, <span style=\"color: #00af00; text-decoration-color: #00af00\">128</span>)  │          <span style=\"color: #00af00; text-decoration-color: #00af00\">0</span> │ conv1d_1[<span style=\"color: #00af00; text-decoration-color: #00af00\">0</span>][<span style=\"color: #00af00; text-decoration-color: #00af00\">0</span>]    │\n",
       "├─────────────────────┼───────────────────┼────────────┼───────────────────┤\n",
       "│ batch_normalization │ (<span style=\"color: #00d7ff; text-decoration-color: #00d7ff\">None</span>, <span style=\"color: #00af00; text-decoration-color: #00af00\">500</span>, <span style=\"color: #00af00; text-decoration-color: #00af00\">128</span>)  │        <span style=\"color: #00af00; text-decoration-color: #00af00\">512</span> │ re_lu[<span style=\"color: #00af00; text-decoration-color: #00af00\">0</span>][<span style=\"color: #00af00; text-decoration-color: #00af00\">0</span>]       │\n",
       "│ (<span style=\"color: #0087ff; text-decoration-color: #0087ff\">BatchNormalizatio…</span> │                   │            │                   │\n",
       "├─────────────────────┼───────────────────┼────────────┼───────────────────┤\n",
       "│ conv1d_2 (<span style=\"color: #0087ff; text-decoration-color: #0087ff\">Conv1D</span>)   │ (<span style=\"color: #00d7ff; text-decoration-color: #00d7ff\">None</span>, <span style=\"color: #00af00; text-decoration-color: #00af00\">500</span>, <span style=\"color: #00af00; text-decoration-color: #00af00\">8</span>)    │      <span style=\"color: #00af00; text-decoration-color: #00af00\">3,080</span> │ batch_normalizat… │\n",
       "├─────────────────────┼───────────────────┼────────────┼───────────────────┤\n",
       "│ re_lu_1 (<span style=\"color: #0087ff; text-decoration-color: #0087ff\">ReLU</span>)      │ (<span style=\"color: #00d7ff; text-decoration-color: #00d7ff\">None</span>, <span style=\"color: #00af00; text-decoration-color: #00af00\">500</span>, <span style=\"color: #00af00; text-decoration-color: #00af00\">8</span>)    │          <span style=\"color: #00af00; text-decoration-color: #00af00\">0</span> │ conv1d_2[<span style=\"color: #00af00; text-decoration-color: #00af00\">0</span>][<span style=\"color: #00af00; text-decoration-color: #00af00\">0</span>]    │\n",
       "├─────────────────────┼───────────────────┼────────────┼───────────────────┤\n",
       "│ batch_normalizatio… │ (<span style=\"color: #00d7ff; text-decoration-color: #00d7ff\">None</span>, <span style=\"color: #00af00; text-decoration-color: #00af00\">500</span>, <span style=\"color: #00af00; text-decoration-color: #00af00\">8</span>)    │         <span style=\"color: #00af00; text-decoration-color: #00af00\">32</span> │ re_lu_1[<span style=\"color: #00af00; text-decoration-color: #00af00\">0</span>][<span style=\"color: #00af00; text-decoration-color: #00af00\">0</span>]     │\n",
       "│ (<span style=\"color: #0087ff; text-decoration-color: #0087ff\">BatchNormalizatio…</span> │                   │            │                   │\n",
       "├─────────────────────┼───────────────────┼────────────┼───────────────────┤\n",
       "│ conv1d (<span style=\"color: #0087ff; text-decoration-color: #0087ff\">Conv1D</span>)     │ (<span style=\"color: #00d7ff; text-decoration-color: #00d7ff\">None</span>, <span style=\"color: #00af00; text-decoration-color: #00af00\">500</span>, <span style=\"color: #00af00; text-decoration-color: #00af00\">8</span>)    │        <span style=\"color: #00af00; text-decoration-color: #00af00\">104</span> │ input_layer[<span style=\"color: #00af00; text-decoration-color: #00af00\">0</span>][<span style=\"color: #00af00; text-decoration-color: #00af00\">0</span>] │\n",
       "├─────────────────────┼───────────────────┼────────────┼───────────────────┤\n",
       "│ add (<span style=\"color: #0087ff; text-decoration-color: #0087ff\">Add</span>)           │ (<span style=\"color: #00d7ff; text-decoration-color: #00d7ff\">None</span>, <span style=\"color: #00af00; text-decoration-color: #00af00\">500</span>, <span style=\"color: #00af00; text-decoration-color: #00af00\">8</span>)    │          <span style=\"color: #00af00; text-decoration-color: #00af00\">0</span> │ batch_normalizat… │\n",
       "│                     │                   │            │ conv1d[<span style=\"color: #00af00; text-decoration-color: #00af00\">0</span>][<span style=\"color: #00af00; text-decoration-color: #00af00\">0</span>]      │\n",
       "├─────────────────────┼───────────────────┼────────────┼───────────────────┤\n",
       "│ re_lu_2 (<span style=\"color: #0087ff; text-decoration-color: #0087ff\">ReLU</span>)      │ (<span style=\"color: #00d7ff; text-decoration-color: #00d7ff\">None</span>, <span style=\"color: #00af00; text-decoration-color: #00af00\">500</span>, <span style=\"color: #00af00; text-decoration-color: #00af00\">8</span>)    │          <span style=\"color: #00af00; text-decoration-color: #00af00\">0</span> │ add[<span style=\"color: #00af00; text-decoration-color: #00af00\">0</span>][<span style=\"color: #00af00; text-decoration-color: #00af00\">0</span>]         │\n",
       "├─────────────────────┼───────────────────┼────────────┼───────────────────┤\n",
       "│ batch_normalizatio… │ (<span style=\"color: #00d7ff; text-decoration-color: #00d7ff\">None</span>, <span style=\"color: #00af00; text-decoration-color: #00af00\">500</span>, <span style=\"color: #00af00; text-decoration-color: #00af00\">8</span>)    │         <span style=\"color: #00af00; text-decoration-color: #00af00\">32</span> │ re_lu_2[<span style=\"color: #00af00; text-decoration-color: #00af00\">0</span>][<span style=\"color: #00af00; text-decoration-color: #00af00\">0</span>]     │\n",
       "│ (<span style=\"color: #0087ff; text-decoration-color: #0087ff\">BatchNormalizatio…</span> │                   │            │                   │\n",
       "├─────────────────────┼───────────────────┼────────────┼───────────────────┤\n",
       "│ max_pooling1d       │ (<span style=\"color: #00d7ff; text-decoration-color: #00d7ff\">None</span>, <span style=\"color: #00af00; text-decoration-color: #00af00\">248</span>, <span style=\"color: #00af00; text-decoration-color: #00af00\">8</span>)    │          <span style=\"color: #00af00; text-decoration-color: #00af00\">0</span> │ batch_normalizat… │\n",
       "│ (<span style=\"color: #0087ff; text-decoration-color: #0087ff\">MaxPooling1D</span>)      │                   │            │                   │\n",
       "├─────────────────────┼───────────────────┼────────────┼───────────────────┤\n",
       "│ conv1d_4 (<span style=\"color: #0087ff; text-decoration-color: #0087ff\">Conv1D</span>)   │ (<span style=\"color: #00d7ff; text-decoration-color: #00d7ff\">None</span>, <span style=\"color: #00af00; text-decoration-color: #00af00\">248</span>, <span style=\"color: #00af00; text-decoration-color: #00af00\">128</span>)  │      <span style=\"color: #00af00; text-decoration-color: #00af00\">3,200</span> │ max_pooling1d[<span style=\"color: #00af00; text-decoration-color: #00af00\">0</span>]… │\n",
       "├─────────────────────┼───────────────────┼────────────┼───────────────────┤\n",
       "│ re_lu_3 (<span style=\"color: #0087ff; text-decoration-color: #0087ff\">ReLU</span>)      │ (<span style=\"color: #00d7ff; text-decoration-color: #00d7ff\">None</span>, <span style=\"color: #00af00; text-decoration-color: #00af00\">248</span>, <span style=\"color: #00af00; text-decoration-color: #00af00\">128</span>)  │          <span style=\"color: #00af00; text-decoration-color: #00af00\">0</span> │ conv1d_4[<span style=\"color: #00af00; text-decoration-color: #00af00\">0</span>][<span style=\"color: #00af00; text-decoration-color: #00af00\">0</span>]    │\n",
       "├─────────────────────┼───────────────────┼────────────┼───────────────────┤\n",
       "│ batch_normalizatio… │ (<span style=\"color: #00d7ff; text-decoration-color: #00d7ff\">None</span>, <span style=\"color: #00af00; text-decoration-color: #00af00\">248</span>, <span style=\"color: #00af00; text-decoration-color: #00af00\">128</span>)  │        <span style=\"color: #00af00; text-decoration-color: #00af00\">512</span> │ re_lu_3[<span style=\"color: #00af00; text-decoration-color: #00af00\">0</span>][<span style=\"color: #00af00; text-decoration-color: #00af00\">0</span>]     │\n",
       "│ (<span style=\"color: #0087ff; text-decoration-color: #0087ff\">BatchNormalizatio…</span> │                   │            │                   │\n",
       "├─────────────────────┼───────────────────┼────────────┼───────────────────┤\n",
       "│ conv1d_5 (<span style=\"color: #0087ff; text-decoration-color: #0087ff\">Conv1D</span>)   │ (<span style=\"color: #00d7ff; text-decoration-color: #00d7ff\">None</span>, <span style=\"color: #00af00; text-decoration-color: #00af00\">248</span>, <span style=\"color: #00af00; text-decoration-color: #00af00\">8</span>)    │      <span style=\"color: #00af00; text-decoration-color: #00af00\">3,080</span> │ batch_normalizat… │\n",
       "├─────────────────────┼───────────────────┼────────────┼───────────────────┤\n",
       "│ re_lu_4 (<span style=\"color: #0087ff; text-decoration-color: #0087ff\">ReLU</span>)      │ (<span style=\"color: #00d7ff; text-decoration-color: #00d7ff\">None</span>, <span style=\"color: #00af00; text-decoration-color: #00af00\">248</span>, <span style=\"color: #00af00; text-decoration-color: #00af00\">8</span>)    │          <span style=\"color: #00af00; text-decoration-color: #00af00\">0</span> │ conv1d_5[<span style=\"color: #00af00; text-decoration-color: #00af00\">0</span>][<span style=\"color: #00af00; text-decoration-color: #00af00\">0</span>]    │\n",
       "├─────────────────────┼───────────────────┼────────────┼───────────────────┤\n",
       "│ batch_normalizatio… │ (<span style=\"color: #00d7ff; text-decoration-color: #00d7ff\">None</span>, <span style=\"color: #00af00; text-decoration-color: #00af00\">248</span>, <span style=\"color: #00af00; text-decoration-color: #00af00\">8</span>)    │         <span style=\"color: #00af00; text-decoration-color: #00af00\">32</span> │ re_lu_4[<span style=\"color: #00af00; text-decoration-color: #00af00\">0</span>][<span style=\"color: #00af00; text-decoration-color: #00af00\">0</span>]     │\n",
       "│ (<span style=\"color: #0087ff; text-decoration-color: #0087ff\">BatchNormalizatio…</span> │                   │            │                   │\n",
       "├─────────────────────┼───────────────────┼────────────┼───────────────────┤\n",
       "│ conv1d_3 (<span style=\"color: #0087ff; text-decoration-color: #0087ff\">Conv1D</span>)   │ (<span style=\"color: #00d7ff; text-decoration-color: #00d7ff\">None</span>, <span style=\"color: #00af00; text-decoration-color: #00af00\">248</span>, <span style=\"color: #00af00; text-decoration-color: #00af00\">8</span>)    │         <span style=\"color: #00af00; text-decoration-color: #00af00\">72</span> │ max_pooling1d[<span style=\"color: #00af00; text-decoration-color: #00af00\">0</span>]… │\n",
       "├─────────────────────┼───────────────────┼────────────┼───────────────────┤\n",
       "│ add_1 (<span style=\"color: #0087ff; text-decoration-color: #0087ff\">Add</span>)         │ (<span style=\"color: #00d7ff; text-decoration-color: #00d7ff\">None</span>, <span style=\"color: #00af00; text-decoration-color: #00af00\">248</span>, <span style=\"color: #00af00; text-decoration-color: #00af00\">8</span>)    │          <span style=\"color: #00af00; text-decoration-color: #00af00\">0</span> │ batch_normalizat… │\n",
       "│                     │                   │            │ conv1d_3[<span style=\"color: #00af00; text-decoration-color: #00af00\">0</span>][<span style=\"color: #00af00; text-decoration-color: #00af00\">0</span>]    │\n",
       "├─────────────────────┼───────────────────┼────────────┼───────────────────┤\n",
       "│ re_lu_5 (<span style=\"color: #0087ff; text-decoration-color: #0087ff\">ReLU</span>)      │ (<span style=\"color: #00d7ff; text-decoration-color: #00d7ff\">None</span>, <span style=\"color: #00af00; text-decoration-color: #00af00\">248</span>, <span style=\"color: #00af00; text-decoration-color: #00af00\">8</span>)    │          <span style=\"color: #00af00; text-decoration-color: #00af00\">0</span> │ add_1[<span style=\"color: #00af00; text-decoration-color: #00af00\">0</span>][<span style=\"color: #00af00; text-decoration-color: #00af00\">0</span>]       │\n",
       "├─────────────────────┼───────────────────┼────────────┼───────────────────┤\n",
       "│ batch_normalizatio… │ (<span style=\"color: #00d7ff; text-decoration-color: #00d7ff\">None</span>, <span style=\"color: #00af00; text-decoration-color: #00af00\">248</span>, <span style=\"color: #00af00; text-decoration-color: #00af00\">8</span>)    │         <span style=\"color: #00af00; text-decoration-color: #00af00\">32</span> │ re_lu_5[<span style=\"color: #00af00; text-decoration-color: #00af00\">0</span>][<span style=\"color: #00af00; text-decoration-color: #00af00\">0</span>]     │\n",
       "│ (<span style=\"color: #0087ff; text-decoration-color: #0087ff\">BatchNormalizatio…</span> │                   │            │                   │\n",
       "├─────────────────────┼───────────────────┼────────────┼───────────────────┤\n",
       "│ max_pooling1d_1     │ (<span style=\"color: #00d7ff; text-decoration-color: #00d7ff\">None</span>, <span style=\"color: #00af00; text-decoration-color: #00af00\">122</span>, <span style=\"color: #00af00; text-decoration-color: #00af00\">8</span>)    │          <span style=\"color: #00af00; text-decoration-color: #00af00\">0</span> │ batch_normalizat… │\n",
       "│ (<span style=\"color: #0087ff; text-decoration-color: #0087ff\">MaxPooling1D</span>)      │                   │            │                   │\n",
       "├─────────────────────┼───────────────────┼────────────┼───────────────────┤\n",
       "│ conv1d_7 (<span style=\"color: #0087ff; text-decoration-color: #0087ff\">Conv1D</span>)   │ (<span style=\"color: #00d7ff; text-decoration-color: #00d7ff\">None</span>, <span style=\"color: #00af00; text-decoration-color: #00af00\">122</span>, <span style=\"color: #00af00; text-decoration-color: #00af00\">128</span>)  │      <span style=\"color: #00af00; text-decoration-color: #00af00\">3,200</span> │ max_pooling1d_1[<span style=\"color: #00af00; text-decoration-color: #00af00\">…</span> │\n",
       "├─────────────────────┼───────────────────┼────────────┼───────────────────┤\n",
       "│ re_lu_6 (<span style=\"color: #0087ff; text-decoration-color: #0087ff\">ReLU</span>)      │ (<span style=\"color: #00d7ff; text-decoration-color: #00d7ff\">None</span>, <span style=\"color: #00af00; text-decoration-color: #00af00\">122</span>, <span style=\"color: #00af00; text-decoration-color: #00af00\">128</span>)  │          <span style=\"color: #00af00; text-decoration-color: #00af00\">0</span> │ conv1d_7[<span style=\"color: #00af00; text-decoration-color: #00af00\">0</span>][<span style=\"color: #00af00; text-decoration-color: #00af00\">0</span>]    │\n",
       "├─────────────────────┼───────────────────┼────────────┼───────────────────┤\n",
       "│ batch_normalizatio… │ (<span style=\"color: #00d7ff; text-decoration-color: #00d7ff\">None</span>, <span style=\"color: #00af00; text-decoration-color: #00af00\">122</span>, <span style=\"color: #00af00; text-decoration-color: #00af00\">128</span>)  │        <span style=\"color: #00af00; text-decoration-color: #00af00\">512</span> │ re_lu_6[<span style=\"color: #00af00; text-decoration-color: #00af00\">0</span>][<span style=\"color: #00af00; text-decoration-color: #00af00\">0</span>]     │\n",
       "│ (<span style=\"color: #0087ff; text-decoration-color: #0087ff\">BatchNormalizatio…</span> │                   │            │                   │\n",
       "├─────────────────────┼───────────────────┼────────────┼───────────────────┤\n",
       "│ conv1d_8 (<span style=\"color: #0087ff; text-decoration-color: #0087ff\">Conv1D</span>)   │ (<span style=\"color: #00d7ff; text-decoration-color: #00d7ff\">None</span>, <span style=\"color: #00af00; text-decoration-color: #00af00\">122</span>, <span style=\"color: #00af00; text-decoration-color: #00af00\">8</span>)    │      <span style=\"color: #00af00; text-decoration-color: #00af00\">3,080</span> │ batch_normalizat… │\n",
       "├─────────────────────┼───────────────────┼────────────┼───────────────────┤\n",
       "│ re_lu_7 (<span style=\"color: #0087ff; text-decoration-color: #0087ff\">ReLU</span>)      │ (<span style=\"color: #00d7ff; text-decoration-color: #00d7ff\">None</span>, <span style=\"color: #00af00; text-decoration-color: #00af00\">122</span>, <span style=\"color: #00af00; text-decoration-color: #00af00\">8</span>)    │          <span style=\"color: #00af00; text-decoration-color: #00af00\">0</span> │ conv1d_8[<span style=\"color: #00af00; text-decoration-color: #00af00\">0</span>][<span style=\"color: #00af00; text-decoration-color: #00af00\">0</span>]    │\n",
       "├─────────────────────┼───────────────────┼────────────┼───────────────────┤\n",
       "│ batch_normalizatio… │ (<span style=\"color: #00d7ff; text-decoration-color: #00d7ff\">None</span>, <span style=\"color: #00af00; text-decoration-color: #00af00\">122</span>, <span style=\"color: #00af00; text-decoration-color: #00af00\">8</span>)    │         <span style=\"color: #00af00; text-decoration-color: #00af00\">32</span> │ re_lu_7[<span style=\"color: #00af00; text-decoration-color: #00af00\">0</span>][<span style=\"color: #00af00; text-decoration-color: #00af00\">0</span>]     │\n",
       "│ (<span style=\"color: #0087ff; text-decoration-color: #0087ff\">BatchNormalizatio…</span> │                   │            │                   │\n",
       "├─────────────────────┼───────────────────┼────────────┼───────────────────┤\n",
       "│ conv1d_6 (<span style=\"color: #0087ff; text-decoration-color: #0087ff\">Conv1D</span>)   │ (<span style=\"color: #00d7ff; text-decoration-color: #00d7ff\">None</span>, <span style=\"color: #00af00; text-decoration-color: #00af00\">122</span>, <span style=\"color: #00af00; text-decoration-color: #00af00\">8</span>)    │         <span style=\"color: #00af00; text-decoration-color: #00af00\">72</span> │ max_pooling1d_1[<span style=\"color: #00af00; text-decoration-color: #00af00\">…</span> │\n",
       "├─────────────────────┼───────────────────┼────────────┼───────────────────┤\n",
       "│ add_2 (<span style=\"color: #0087ff; text-decoration-color: #0087ff\">Add</span>)         │ (<span style=\"color: #00d7ff; text-decoration-color: #00d7ff\">None</span>, <span style=\"color: #00af00; text-decoration-color: #00af00\">122</span>, <span style=\"color: #00af00; text-decoration-color: #00af00\">8</span>)    │          <span style=\"color: #00af00; text-decoration-color: #00af00\">0</span> │ batch_normalizat… │\n",
       "│                     │                   │            │ conv1d_6[<span style=\"color: #00af00; text-decoration-color: #00af00\">0</span>][<span style=\"color: #00af00; text-decoration-color: #00af00\">0</span>]    │\n",
       "├─────────────────────┼───────────────────┼────────────┼───────────────────┤\n",
       "│ re_lu_8 (<span style=\"color: #0087ff; text-decoration-color: #0087ff\">ReLU</span>)      │ (<span style=\"color: #00d7ff; text-decoration-color: #00d7ff\">None</span>, <span style=\"color: #00af00; text-decoration-color: #00af00\">122</span>, <span style=\"color: #00af00; text-decoration-color: #00af00\">8</span>)    │          <span style=\"color: #00af00; text-decoration-color: #00af00\">0</span> │ add_2[<span style=\"color: #00af00; text-decoration-color: #00af00\">0</span>][<span style=\"color: #00af00; text-decoration-color: #00af00\">0</span>]       │\n",
       "├─────────────────────┼───────────────────┼────────────┼───────────────────┤\n",
       "│ batch_normalizatio… │ (<span style=\"color: #00d7ff; text-decoration-color: #00d7ff\">None</span>, <span style=\"color: #00af00; text-decoration-color: #00af00\">122</span>, <span style=\"color: #00af00; text-decoration-color: #00af00\">8</span>)    │         <span style=\"color: #00af00; text-decoration-color: #00af00\">32</span> │ re_lu_8[<span style=\"color: #00af00; text-decoration-color: #00af00\">0</span>][<span style=\"color: #00af00; text-decoration-color: #00af00\">0</span>]     │\n",
       "│ (<span style=\"color: #0087ff; text-decoration-color: #0087ff\">BatchNormalizatio…</span> │                   │            │                   │\n",
       "├─────────────────────┼───────────────────┼────────────┼───────────────────┤\n",
       "│ max_pooling1d_2     │ (<span style=\"color: #00d7ff; text-decoration-color: #00d7ff\">None</span>, <span style=\"color: #00af00; text-decoration-color: #00af00\">59</span>, <span style=\"color: #00af00; text-decoration-color: #00af00\">8</span>)     │          <span style=\"color: #00af00; text-decoration-color: #00af00\">0</span> │ batch_normalizat… │\n",
       "│ (<span style=\"color: #0087ff; text-decoration-color: #0087ff\">MaxPooling1D</span>)      │                   │            │                   │\n",
       "├─────────────────────┼───────────────────┼────────────┼───────────────────┤\n",
       "│ conv1d_10 (<span style=\"color: #0087ff; text-decoration-color: #0087ff\">Conv1D</span>)  │ (<span style=\"color: #00d7ff; text-decoration-color: #00d7ff\">None</span>, <span style=\"color: #00af00; text-decoration-color: #00af00\">59</span>, <span style=\"color: #00af00; text-decoration-color: #00af00\">128</span>)   │      <span style=\"color: #00af00; text-decoration-color: #00af00\">3,200</span> │ max_pooling1d_2[<span style=\"color: #00af00; text-decoration-color: #00af00\">…</span> │\n",
       "├─────────────────────┼───────────────────┼────────────┼───────────────────┤\n",
       "│ re_lu_9 (<span style=\"color: #0087ff; text-decoration-color: #0087ff\">ReLU</span>)      │ (<span style=\"color: #00d7ff; text-decoration-color: #00d7ff\">None</span>, <span style=\"color: #00af00; text-decoration-color: #00af00\">59</span>, <span style=\"color: #00af00; text-decoration-color: #00af00\">128</span>)   │          <span style=\"color: #00af00; text-decoration-color: #00af00\">0</span> │ conv1d_10[<span style=\"color: #00af00; text-decoration-color: #00af00\">0</span>][<span style=\"color: #00af00; text-decoration-color: #00af00\">0</span>]   │\n",
       "├─────────────────────┼───────────────────┼────────────┼───────────────────┤\n",
       "│ batch_normalizatio… │ (<span style=\"color: #00d7ff; text-decoration-color: #00d7ff\">None</span>, <span style=\"color: #00af00; text-decoration-color: #00af00\">59</span>, <span style=\"color: #00af00; text-decoration-color: #00af00\">128</span>)   │        <span style=\"color: #00af00; text-decoration-color: #00af00\">512</span> │ re_lu_9[<span style=\"color: #00af00; text-decoration-color: #00af00\">0</span>][<span style=\"color: #00af00; text-decoration-color: #00af00\">0</span>]     │\n",
       "│ (<span style=\"color: #0087ff; text-decoration-color: #0087ff\">BatchNormalizatio…</span> │                   │            │                   │\n",
       "├─────────────────────┼───────────────────┼────────────┼───────────────────┤\n",
       "│ conv1d_11 (<span style=\"color: #0087ff; text-decoration-color: #0087ff\">Conv1D</span>)  │ (<span style=\"color: #00d7ff; text-decoration-color: #00d7ff\">None</span>, <span style=\"color: #00af00; text-decoration-color: #00af00\">59</span>, <span style=\"color: #00af00; text-decoration-color: #00af00\">8</span>)     │      <span style=\"color: #00af00; text-decoration-color: #00af00\">3,080</span> │ batch_normalizat… │\n",
       "├─────────────────────┼───────────────────┼────────────┼───────────────────┤\n",
       "│ re_lu_10 (<span style=\"color: #0087ff; text-decoration-color: #0087ff\">ReLU</span>)     │ (<span style=\"color: #00d7ff; text-decoration-color: #00d7ff\">None</span>, <span style=\"color: #00af00; text-decoration-color: #00af00\">59</span>, <span style=\"color: #00af00; text-decoration-color: #00af00\">8</span>)     │          <span style=\"color: #00af00; text-decoration-color: #00af00\">0</span> │ conv1d_11[<span style=\"color: #00af00; text-decoration-color: #00af00\">0</span>][<span style=\"color: #00af00; text-decoration-color: #00af00\">0</span>]   │\n",
       "├─────────────────────┼───────────────────┼────────────┼───────────────────┤\n",
       "│ batch_normalizatio… │ (<span style=\"color: #00d7ff; text-decoration-color: #00d7ff\">None</span>, <span style=\"color: #00af00; text-decoration-color: #00af00\">59</span>, <span style=\"color: #00af00; text-decoration-color: #00af00\">8</span>)     │         <span style=\"color: #00af00; text-decoration-color: #00af00\">32</span> │ re_lu_10[<span style=\"color: #00af00; text-decoration-color: #00af00\">0</span>][<span style=\"color: #00af00; text-decoration-color: #00af00\">0</span>]    │\n",
       "│ (<span style=\"color: #0087ff; text-decoration-color: #0087ff\">BatchNormalizatio…</span> │                   │            │                   │\n",
       "├─────────────────────┼───────────────────┼────────────┼───────────────────┤\n",
       "│ conv1d_9 (<span style=\"color: #0087ff; text-decoration-color: #0087ff\">Conv1D</span>)   │ (<span style=\"color: #00d7ff; text-decoration-color: #00d7ff\">None</span>, <span style=\"color: #00af00; text-decoration-color: #00af00\">59</span>, <span style=\"color: #00af00; text-decoration-color: #00af00\">8</span>)     │         <span style=\"color: #00af00; text-decoration-color: #00af00\">72</span> │ max_pooling1d_2[<span style=\"color: #00af00; text-decoration-color: #00af00\">…</span> │\n",
       "├─────────────────────┼───────────────────┼────────────┼───────────────────┤\n",
       "│ add_3 (<span style=\"color: #0087ff; text-decoration-color: #0087ff\">Add</span>)         │ (<span style=\"color: #00d7ff; text-decoration-color: #00d7ff\">None</span>, <span style=\"color: #00af00; text-decoration-color: #00af00\">59</span>, <span style=\"color: #00af00; text-decoration-color: #00af00\">8</span>)     │          <span style=\"color: #00af00; text-decoration-color: #00af00\">0</span> │ batch_normalizat… │\n",
       "│                     │                   │            │ conv1d_9[<span style=\"color: #00af00; text-decoration-color: #00af00\">0</span>][<span style=\"color: #00af00; text-decoration-color: #00af00\">0</span>]    │\n",
       "├─────────────────────┼───────────────────┼────────────┼───────────────────┤\n",
       "│ re_lu_11 (<span style=\"color: #0087ff; text-decoration-color: #0087ff\">ReLU</span>)     │ (<span style=\"color: #00d7ff; text-decoration-color: #00d7ff\">None</span>, <span style=\"color: #00af00; text-decoration-color: #00af00\">59</span>, <span style=\"color: #00af00; text-decoration-color: #00af00\">8</span>)     │          <span style=\"color: #00af00; text-decoration-color: #00af00\">0</span> │ add_3[<span style=\"color: #00af00; text-decoration-color: #00af00\">0</span>][<span style=\"color: #00af00; text-decoration-color: #00af00\">0</span>]       │\n",
       "├─────────────────────┼───────────────────┼────────────┼───────────────────┤\n",
       "│ batch_normalizatio… │ (<span style=\"color: #00d7ff; text-decoration-color: #00d7ff\">None</span>, <span style=\"color: #00af00; text-decoration-color: #00af00\">59</span>, <span style=\"color: #00af00; text-decoration-color: #00af00\">8</span>)     │         <span style=\"color: #00af00; text-decoration-color: #00af00\">32</span> │ re_lu_11[<span style=\"color: #00af00; text-decoration-color: #00af00\">0</span>][<span style=\"color: #00af00; text-decoration-color: #00af00\">0</span>]    │\n",
       "│ (<span style=\"color: #0087ff; text-decoration-color: #0087ff\">BatchNormalizatio…</span> │                   │            │                   │\n",
       "├─────────────────────┼───────────────────┼────────────┼───────────────────┤\n",
       "│ max_pooling1d_3     │ (<span style=\"color: #00d7ff; text-decoration-color: #00d7ff\">None</span>, <span style=\"color: #00af00; text-decoration-color: #00af00\">28</span>, <span style=\"color: #00af00; text-decoration-color: #00af00\">8</span>)     │          <span style=\"color: #00af00; text-decoration-color: #00af00\">0</span> │ batch_normalizat… │\n",
       "│ (<span style=\"color: #0087ff; text-decoration-color: #0087ff\">MaxPooling1D</span>)      │                   │            │                   │\n",
       "├─────────────────────┼───────────────────┼────────────┼───────────────────┤\n",
       "│ conv1d_13 (<span style=\"color: #0087ff; text-decoration-color: #0087ff\">Conv1D</span>)  │ (<span style=\"color: #00d7ff; text-decoration-color: #00d7ff\">None</span>, <span style=\"color: #00af00; text-decoration-color: #00af00\">28</span>, <span style=\"color: #00af00; text-decoration-color: #00af00\">128</span>)   │      <span style=\"color: #00af00; text-decoration-color: #00af00\">3,200</span> │ max_pooling1d_3[<span style=\"color: #00af00; text-decoration-color: #00af00\">…</span> │\n",
       "├─────────────────────┼───────────────────┼────────────┼───────────────────┤\n",
       "│ re_lu_12 (<span style=\"color: #0087ff; text-decoration-color: #0087ff\">ReLU</span>)     │ (<span style=\"color: #00d7ff; text-decoration-color: #00d7ff\">None</span>, <span style=\"color: #00af00; text-decoration-color: #00af00\">28</span>, <span style=\"color: #00af00; text-decoration-color: #00af00\">128</span>)   │          <span style=\"color: #00af00; text-decoration-color: #00af00\">0</span> │ conv1d_13[<span style=\"color: #00af00; text-decoration-color: #00af00\">0</span>][<span style=\"color: #00af00; text-decoration-color: #00af00\">0</span>]   │\n",
       "├─────────────────────┼───────────────────┼────────────┼───────────────────┤\n",
       "│ batch_normalizatio… │ (<span style=\"color: #00d7ff; text-decoration-color: #00d7ff\">None</span>, <span style=\"color: #00af00; text-decoration-color: #00af00\">28</span>, <span style=\"color: #00af00; text-decoration-color: #00af00\">128</span>)   │        <span style=\"color: #00af00; text-decoration-color: #00af00\">512</span> │ re_lu_12[<span style=\"color: #00af00; text-decoration-color: #00af00\">0</span>][<span style=\"color: #00af00; text-decoration-color: #00af00\">0</span>]    │\n",
       "│ (<span style=\"color: #0087ff; text-decoration-color: #0087ff\">BatchNormalizatio…</span> │                   │            │                   │\n",
       "├─────────────────────┼───────────────────┼────────────┼───────────────────┤\n",
       "│ conv1d_14 (<span style=\"color: #0087ff; text-decoration-color: #0087ff\">Conv1D</span>)  │ (<span style=\"color: #00d7ff; text-decoration-color: #00d7ff\">None</span>, <span style=\"color: #00af00; text-decoration-color: #00af00\">28</span>, <span style=\"color: #00af00; text-decoration-color: #00af00\">8</span>)     │      <span style=\"color: #00af00; text-decoration-color: #00af00\">3,080</span> │ batch_normalizat… │\n",
       "├─────────────────────┼───────────────────┼────────────┼───────────────────┤\n",
       "│ re_lu_13 (<span style=\"color: #0087ff; text-decoration-color: #0087ff\">ReLU</span>)     │ (<span style=\"color: #00d7ff; text-decoration-color: #00d7ff\">None</span>, <span style=\"color: #00af00; text-decoration-color: #00af00\">28</span>, <span style=\"color: #00af00; text-decoration-color: #00af00\">8</span>)     │          <span style=\"color: #00af00; text-decoration-color: #00af00\">0</span> │ conv1d_14[<span style=\"color: #00af00; text-decoration-color: #00af00\">0</span>][<span style=\"color: #00af00; text-decoration-color: #00af00\">0</span>]   │\n",
       "├─────────────────────┼───────────────────┼────────────┼───────────────────┤\n",
       "│ batch_normalizatio… │ (<span style=\"color: #00d7ff; text-decoration-color: #00d7ff\">None</span>, <span style=\"color: #00af00; text-decoration-color: #00af00\">28</span>, <span style=\"color: #00af00; text-decoration-color: #00af00\">8</span>)     │         <span style=\"color: #00af00; text-decoration-color: #00af00\">32</span> │ re_lu_13[<span style=\"color: #00af00; text-decoration-color: #00af00\">0</span>][<span style=\"color: #00af00; text-decoration-color: #00af00\">0</span>]    │\n",
       "│ (<span style=\"color: #0087ff; text-decoration-color: #0087ff\">BatchNormalizatio…</span> │                   │            │                   │\n",
       "├─────────────────────┼───────────────────┼────────────┼───────────────────┤\n",
       "│ conv1d_12 (<span style=\"color: #0087ff; text-decoration-color: #0087ff\">Conv1D</span>)  │ (<span style=\"color: #00d7ff; text-decoration-color: #00d7ff\">None</span>, <span style=\"color: #00af00; text-decoration-color: #00af00\">28</span>, <span style=\"color: #00af00; text-decoration-color: #00af00\">8</span>)     │         <span style=\"color: #00af00; text-decoration-color: #00af00\">72</span> │ max_pooling1d_3[<span style=\"color: #00af00; text-decoration-color: #00af00\">…</span> │\n",
       "├─────────────────────┼───────────────────┼────────────┼───────────────────┤\n",
       "│ add_4 (<span style=\"color: #0087ff; text-decoration-color: #0087ff\">Add</span>)         │ (<span style=\"color: #00d7ff; text-decoration-color: #00d7ff\">None</span>, <span style=\"color: #00af00; text-decoration-color: #00af00\">28</span>, <span style=\"color: #00af00; text-decoration-color: #00af00\">8</span>)     │          <span style=\"color: #00af00; text-decoration-color: #00af00\">0</span> │ batch_normalizat… │\n",
       "│                     │                   │            │ conv1d_12[<span style=\"color: #00af00; text-decoration-color: #00af00\">0</span>][<span style=\"color: #00af00; text-decoration-color: #00af00\">0</span>]   │\n",
       "├─────────────────────┼───────────────────┼────────────┼───────────────────┤\n",
       "│ re_lu_14 (<span style=\"color: #0087ff; text-decoration-color: #0087ff\">ReLU</span>)     │ (<span style=\"color: #00d7ff; text-decoration-color: #00d7ff\">None</span>, <span style=\"color: #00af00; text-decoration-color: #00af00\">28</span>, <span style=\"color: #00af00; text-decoration-color: #00af00\">8</span>)     │          <span style=\"color: #00af00; text-decoration-color: #00af00\">0</span> │ add_4[<span style=\"color: #00af00; text-decoration-color: #00af00\">0</span>][<span style=\"color: #00af00; text-decoration-color: #00af00\">0</span>]       │\n",
       "├─────────────────────┼───────────────────┼────────────┼───────────────────┤\n",
       "│ batch_normalizatio… │ (<span style=\"color: #00d7ff; text-decoration-color: #00d7ff\">None</span>, <span style=\"color: #00af00; text-decoration-color: #00af00\">28</span>, <span style=\"color: #00af00; text-decoration-color: #00af00\">8</span>)     │         <span style=\"color: #00af00; text-decoration-color: #00af00\">32</span> │ re_lu_14[<span style=\"color: #00af00; text-decoration-color: #00af00\">0</span>][<span style=\"color: #00af00; text-decoration-color: #00af00\">0</span>]    │\n",
       "│ (<span style=\"color: #0087ff; text-decoration-color: #0087ff\">BatchNormalizatio…</span> │                   │            │                   │\n",
       "├─────────────────────┼───────────────────┼────────────┼───────────────────┤\n",
       "│ max_pooling1d_4     │ (<span style=\"color: #00d7ff; text-decoration-color: #00d7ff\">None</span>, <span style=\"color: #00af00; text-decoration-color: #00af00\">12</span>, <span style=\"color: #00af00; text-decoration-color: #00af00\">8</span>)     │          <span style=\"color: #00af00; text-decoration-color: #00af00\">0</span> │ batch_normalizat… │\n",
       "│ (<span style=\"color: #0087ff; text-decoration-color: #0087ff\">MaxPooling1D</span>)      │                   │            │                   │\n",
       "├─────────────────────┼───────────────────┼────────────┼───────────────────┤\n",
       "│ flatten (<span style=\"color: #0087ff; text-decoration-color: #0087ff\">Flatten</span>)   │ (<span style=\"color: #00d7ff; text-decoration-color: #00d7ff\">None</span>, <span style=\"color: #00af00; text-decoration-color: #00af00\">96</span>)        │          <span style=\"color: #00af00; text-decoration-color: #00af00\">0</span> │ max_pooling1d_4[<span style=\"color: #00af00; text-decoration-color: #00af00\">…</span> │\n",
       "├─────────────────────┼───────────────────┼────────────┼───────────────────┤\n",
       "│ dense (<span style=\"color: #0087ff; text-decoration-color: #0087ff\">Dense</span>)       │ (<span style=\"color: #00d7ff; text-decoration-color: #00d7ff\">None</span>, <span style=\"color: #00af00; text-decoration-color: #00af00\">8</span>)         │        <span style=\"color: #00af00; text-decoration-color: #00af00\">776</span> │ flatten[<span style=\"color: #00af00; text-decoration-color: #00af00\">0</span>][<span style=\"color: #00af00; text-decoration-color: #00af00\">0</span>]     │\n",
       "├─────────────────────┼───────────────────┼────────────┼───────────────────┤\n",
       "│ dropout (<span style=\"color: #0087ff; text-decoration-color: #0087ff\">Dropout</span>)   │ (<span style=\"color: #00d7ff; text-decoration-color: #00d7ff\">None</span>, <span style=\"color: #00af00; text-decoration-color: #00af00\">8</span>)         │          <span style=\"color: #00af00; text-decoration-color: #00af00\">0</span> │ dense[<span style=\"color: #00af00; text-decoration-color: #00af00\">0</span>][<span style=\"color: #00af00; text-decoration-color: #00af00\">0</span>]       │\n",
       "├─────────────────────┼───────────────────┼────────────┼───────────────────┤\n",
       "│ dense_1 (<span style=\"color: #0087ff; text-decoration-color: #0087ff\">Dense</span>)     │ (<span style=\"color: #00d7ff; text-decoration-color: #00d7ff\">None</span>, <span style=\"color: #00af00; text-decoration-color: #00af00\">128</span>)       │      <span style=\"color: #00af00; text-decoration-color: #00af00\">1,152</span> │ dropout[<span style=\"color: #00af00; text-decoration-color: #00af00\">0</span>][<span style=\"color: #00af00; text-decoration-color: #00af00\">0</span>]     │\n",
       "├─────────────────────┼───────────────────┼────────────┼───────────────────┤\n",
       "│ dropout_1 (<span style=\"color: #0087ff; text-decoration-color: #0087ff\">Dropout</span>) │ (<span style=\"color: #00d7ff; text-decoration-color: #00d7ff\">None</span>, <span style=\"color: #00af00; text-decoration-color: #00af00\">128</span>)       │          <span style=\"color: #00af00; text-decoration-color: #00af00\">0</span> │ dense_1[<span style=\"color: #00af00; text-decoration-color: #00af00\">0</span>][<span style=\"color: #00af00; text-decoration-color: #00af00\">0</span>]     │\n",
       "├─────────────────────┼───────────────────┼────────────┼───────────────────┤\n",
       "│ dense_2 (<span style=\"color: #0087ff; text-decoration-color: #0087ff\">Dense</span>)     │ (<span style=\"color: #00d7ff; text-decoration-color: #00d7ff\">None</span>, <span style=\"color: #00af00; text-decoration-color: #00af00\">4</span>)         │        <span style=\"color: #00af00; text-decoration-color: #00af00\">516</span> │ dropout_1[<span style=\"color: #00af00; text-decoration-color: #00af00\">0</span>][<span style=\"color: #00af00; text-decoration-color: #00af00\">0</span>]   │\n",
       "└─────────────────────┴───────────────────┴────────────┴───────────────────┘\n",
       "</pre>\n"
      ],
      "text/plain": [
       "┏━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━┳━━━━━━━━━━━━━━━━━━━┓\n",
       "┃\u001b[1m \u001b[0m\u001b[1mLayer (type)       \u001b[0m\u001b[1m \u001b[0m┃\u001b[1m \u001b[0m\u001b[1mOutput Shape     \u001b[0m\u001b[1m \u001b[0m┃\u001b[1m \u001b[0m\u001b[1m   Param #\u001b[0m\u001b[1m \u001b[0m┃\u001b[1m \u001b[0m\u001b[1mConnected to     \u001b[0m\u001b[1m \u001b[0m┃\n",
       "┡━━━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━╇━━━━━━━━━━━━━━━━━━━┩\n",
       "│ input_layer         │ (\u001b[38;5;45mNone\u001b[0m, \u001b[38;5;34m500\u001b[0m, \u001b[38;5;34m12\u001b[0m)   │          \u001b[38;5;34m0\u001b[0m │ -                 │\n",
       "│ (\u001b[38;5;33mInputLayer\u001b[0m)        │                   │            │                   │\n",
       "├─────────────────────┼───────────────────┼────────────┼───────────────────┤\n",
       "│ conv1d_1 (\u001b[38;5;33mConv1D\u001b[0m)   │ (\u001b[38;5;45mNone\u001b[0m, \u001b[38;5;34m500\u001b[0m, \u001b[38;5;34m128\u001b[0m)  │      \u001b[38;5;34m4,736\u001b[0m │ input_layer[\u001b[38;5;34m0\u001b[0m][\u001b[38;5;34m0\u001b[0m] │\n",
       "├─────────────────────┼───────────────────┼────────────┼───────────────────┤\n",
       "│ re_lu (\u001b[38;5;33mReLU\u001b[0m)        │ (\u001b[38;5;45mNone\u001b[0m, \u001b[38;5;34m500\u001b[0m, \u001b[38;5;34m128\u001b[0m)  │          \u001b[38;5;34m0\u001b[0m │ conv1d_1[\u001b[38;5;34m0\u001b[0m][\u001b[38;5;34m0\u001b[0m]    │\n",
       "├─────────────────────┼───────────────────┼────────────┼───────────────────┤\n",
       "│ batch_normalization │ (\u001b[38;5;45mNone\u001b[0m, \u001b[38;5;34m500\u001b[0m, \u001b[38;5;34m128\u001b[0m)  │        \u001b[38;5;34m512\u001b[0m │ re_lu[\u001b[38;5;34m0\u001b[0m][\u001b[38;5;34m0\u001b[0m]       │\n",
       "│ (\u001b[38;5;33mBatchNormalizatio…\u001b[0m │                   │            │                   │\n",
       "├─────────────────────┼───────────────────┼────────────┼───────────────────┤\n",
       "│ conv1d_2 (\u001b[38;5;33mConv1D\u001b[0m)   │ (\u001b[38;5;45mNone\u001b[0m, \u001b[38;5;34m500\u001b[0m, \u001b[38;5;34m8\u001b[0m)    │      \u001b[38;5;34m3,080\u001b[0m │ batch_normalizat… │\n",
       "├─────────────────────┼───────────────────┼────────────┼───────────────────┤\n",
       "│ re_lu_1 (\u001b[38;5;33mReLU\u001b[0m)      │ (\u001b[38;5;45mNone\u001b[0m, \u001b[38;5;34m500\u001b[0m, \u001b[38;5;34m8\u001b[0m)    │          \u001b[38;5;34m0\u001b[0m │ conv1d_2[\u001b[38;5;34m0\u001b[0m][\u001b[38;5;34m0\u001b[0m]    │\n",
       "├─────────────────────┼───────────────────┼────────────┼───────────────────┤\n",
       "│ batch_normalizatio… │ (\u001b[38;5;45mNone\u001b[0m, \u001b[38;5;34m500\u001b[0m, \u001b[38;5;34m8\u001b[0m)    │         \u001b[38;5;34m32\u001b[0m │ re_lu_1[\u001b[38;5;34m0\u001b[0m][\u001b[38;5;34m0\u001b[0m]     │\n",
       "│ (\u001b[38;5;33mBatchNormalizatio…\u001b[0m │                   │            │                   │\n",
       "├─────────────────────┼───────────────────┼────────────┼───────────────────┤\n",
       "│ conv1d (\u001b[38;5;33mConv1D\u001b[0m)     │ (\u001b[38;5;45mNone\u001b[0m, \u001b[38;5;34m500\u001b[0m, \u001b[38;5;34m8\u001b[0m)    │        \u001b[38;5;34m104\u001b[0m │ input_layer[\u001b[38;5;34m0\u001b[0m][\u001b[38;5;34m0\u001b[0m] │\n",
       "├─────────────────────┼───────────────────┼────────────┼───────────────────┤\n",
       "│ add (\u001b[38;5;33mAdd\u001b[0m)           │ (\u001b[38;5;45mNone\u001b[0m, \u001b[38;5;34m500\u001b[0m, \u001b[38;5;34m8\u001b[0m)    │          \u001b[38;5;34m0\u001b[0m │ batch_normalizat… │\n",
       "│                     │                   │            │ conv1d[\u001b[38;5;34m0\u001b[0m][\u001b[38;5;34m0\u001b[0m]      │\n",
       "├─────────────────────┼───────────────────┼────────────┼───────────────────┤\n",
       "│ re_lu_2 (\u001b[38;5;33mReLU\u001b[0m)      │ (\u001b[38;5;45mNone\u001b[0m, \u001b[38;5;34m500\u001b[0m, \u001b[38;5;34m8\u001b[0m)    │          \u001b[38;5;34m0\u001b[0m │ add[\u001b[38;5;34m0\u001b[0m][\u001b[38;5;34m0\u001b[0m]         │\n",
       "├─────────────────────┼───────────────────┼────────────┼───────────────────┤\n",
       "│ batch_normalizatio… │ (\u001b[38;5;45mNone\u001b[0m, \u001b[38;5;34m500\u001b[0m, \u001b[38;5;34m8\u001b[0m)    │         \u001b[38;5;34m32\u001b[0m │ re_lu_2[\u001b[38;5;34m0\u001b[0m][\u001b[38;5;34m0\u001b[0m]     │\n",
       "│ (\u001b[38;5;33mBatchNormalizatio…\u001b[0m │                   │            │                   │\n",
       "├─────────────────────┼───────────────────┼────────────┼───────────────────┤\n",
       "│ max_pooling1d       │ (\u001b[38;5;45mNone\u001b[0m, \u001b[38;5;34m248\u001b[0m, \u001b[38;5;34m8\u001b[0m)    │          \u001b[38;5;34m0\u001b[0m │ batch_normalizat… │\n",
       "│ (\u001b[38;5;33mMaxPooling1D\u001b[0m)      │                   │            │                   │\n",
       "├─────────────────────┼───────────────────┼────────────┼───────────────────┤\n",
       "│ conv1d_4 (\u001b[38;5;33mConv1D\u001b[0m)   │ (\u001b[38;5;45mNone\u001b[0m, \u001b[38;5;34m248\u001b[0m, \u001b[38;5;34m128\u001b[0m)  │      \u001b[38;5;34m3,200\u001b[0m │ max_pooling1d[\u001b[38;5;34m0\u001b[0m]… │\n",
       "├─────────────────────┼───────────────────┼────────────┼───────────────────┤\n",
       "│ re_lu_3 (\u001b[38;5;33mReLU\u001b[0m)      │ (\u001b[38;5;45mNone\u001b[0m, \u001b[38;5;34m248\u001b[0m, \u001b[38;5;34m128\u001b[0m)  │          \u001b[38;5;34m0\u001b[0m │ conv1d_4[\u001b[38;5;34m0\u001b[0m][\u001b[38;5;34m0\u001b[0m]    │\n",
       "├─────────────────────┼───────────────────┼────────────┼───────────────────┤\n",
       "│ batch_normalizatio… │ (\u001b[38;5;45mNone\u001b[0m, \u001b[38;5;34m248\u001b[0m, \u001b[38;5;34m128\u001b[0m)  │        \u001b[38;5;34m512\u001b[0m │ re_lu_3[\u001b[38;5;34m0\u001b[0m][\u001b[38;5;34m0\u001b[0m]     │\n",
       "│ (\u001b[38;5;33mBatchNormalizatio…\u001b[0m │                   │            │                   │\n",
       "├─────────────────────┼───────────────────┼────────────┼───────────────────┤\n",
       "│ conv1d_5 (\u001b[38;5;33mConv1D\u001b[0m)   │ (\u001b[38;5;45mNone\u001b[0m, \u001b[38;5;34m248\u001b[0m, \u001b[38;5;34m8\u001b[0m)    │      \u001b[38;5;34m3,080\u001b[0m │ batch_normalizat… │\n",
       "├─────────────────────┼───────────────────┼────────────┼───────────────────┤\n",
       "│ re_lu_4 (\u001b[38;5;33mReLU\u001b[0m)      │ (\u001b[38;5;45mNone\u001b[0m, \u001b[38;5;34m248\u001b[0m, \u001b[38;5;34m8\u001b[0m)    │          \u001b[38;5;34m0\u001b[0m │ conv1d_5[\u001b[38;5;34m0\u001b[0m][\u001b[38;5;34m0\u001b[0m]    │\n",
       "├─────────────────────┼───────────────────┼────────────┼───────────────────┤\n",
       "│ batch_normalizatio… │ (\u001b[38;5;45mNone\u001b[0m, \u001b[38;5;34m248\u001b[0m, \u001b[38;5;34m8\u001b[0m)    │         \u001b[38;5;34m32\u001b[0m │ re_lu_4[\u001b[38;5;34m0\u001b[0m][\u001b[38;5;34m0\u001b[0m]     │\n",
       "│ (\u001b[38;5;33mBatchNormalizatio…\u001b[0m │                   │            │                   │\n",
       "├─────────────────────┼───────────────────┼────────────┼───────────────────┤\n",
       "│ conv1d_3 (\u001b[38;5;33mConv1D\u001b[0m)   │ (\u001b[38;5;45mNone\u001b[0m, \u001b[38;5;34m248\u001b[0m, \u001b[38;5;34m8\u001b[0m)    │         \u001b[38;5;34m72\u001b[0m │ max_pooling1d[\u001b[38;5;34m0\u001b[0m]… │\n",
       "├─────────────────────┼───────────────────┼────────────┼───────────────────┤\n",
       "│ add_1 (\u001b[38;5;33mAdd\u001b[0m)         │ (\u001b[38;5;45mNone\u001b[0m, \u001b[38;5;34m248\u001b[0m, \u001b[38;5;34m8\u001b[0m)    │          \u001b[38;5;34m0\u001b[0m │ batch_normalizat… │\n",
       "│                     │                   │            │ conv1d_3[\u001b[38;5;34m0\u001b[0m][\u001b[38;5;34m0\u001b[0m]    │\n",
       "├─────────────────────┼───────────────────┼────────────┼───────────────────┤\n",
       "│ re_lu_5 (\u001b[38;5;33mReLU\u001b[0m)      │ (\u001b[38;5;45mNone\u001b[0m, \u001b[38;5;34m248\u001b[0m, \u001b[38;5;34m8\u001b[0m)    │          \u001b[38;5;34m0\u001b[0m │ add_1[\u001b[38;5;34m0\u001b[0m][\u001b[38;5;34m0\u001b[0m]       │\n",
       "├─────────────────────┼───────────────────┼────────────┼───────────────────┤\n",
       "│ batch_normalizatio… │ (\u001b[38;5;45mNone\u001b[0m, \u001b[38;5;34m248\u001b[0m, \u001b[38;5;34m8\u001b[0m)    │         \u001b[38;5;34m32\u001b[0m │ re_lu_5[\u001b[38;5;34m0\u001b[0m][\u001b[38;5;34m0\u001b[0m]     │\n",
       "│ (\u001b[38;5;33mBatchNormalizatio…\u001b[0m │                   │            │                   │\n",
       "├─────────────────────┼───────────────────┼────────────┼───────────────────┤\n",
       "│ max_pooling1d_1     │ (\u001b[38;5;45mNone\u001b[0m, \u001b[38;5;34m122\u001b[0m, \u001b[38;5;34m8\u001b[0m)    │          \u001b[38;5;34m0\u001b[0m │ batch_normalizat… │\n",
       "│ (\u001b[38;5;33mMaxPooling1D\u001b[0m)      │                   │            │                   │\n",
       "├─────────────────────┼───────────────────┼────────────┼───────────────────┤\n",
       "│ conv1d_7 (\u001b[38;5;33mConv1D\u001b[0m)   │ (\u001b[38;5;45mNone\u001b[0m, \u001b[38;5;34m122\u001b[0m, \u001b[38;5;34m128\u001b[0m)  │      \u001b[38;5;34m3,200\u001b[0m │ max_pooling1d_1[\u001b[38;5;34m…\u001b[0m │\n",
       "├─────────────────────┼───────────────────┼────────────┼───────────────────┤\n",
       "│ re_lu_6 (\u001b[38;5;33mReLU\u001b[0m)      │ (\u001b[38;5;45mNone\u001b[0m, \u001b[38;5;34m122\u001b[0m, \u001b[38;5;34m128\u001b[0m)  │          \u001b[38;5;34m0\u001b[0m │ conv1d_7[\u001b[38;5;34m0\u001b[0m][\u001b[38;5;34m0\u001b[0m]    │\n",
       "├─────────────────────┼───────────────────┼────────────┼───────────────────┤\n",
       "│ batch_normalizatio… │ (\u001b[38;5;45mNone\u001b[0m, \u001b[38;5;34m122\u001b[0m, \u001b[38;5;34m128\u001b[0m)  │        \u001b[38;5;34m512\u001b[0m │ re_lu_6[\u001b[38;5;34m0\u001b[0m][\u001b[38;5;34m0\u001b[0m]     │\n",
       "│ (\u001b[38;5;33mBatchNormalizatio…\u001b[0m │                   │            │                   │\n",
       "├─────────────────────┼───────────────────┼────────────┼───────────────────┤\n",
       "│ conv1d_8 (\u001b[38;5;33mConv1D\u001b[0m)   │ (\u001b[38;5;45mNone\u001b[0m, \u001b[38;5;34m122\u001b[0m, \u001b[38;5;34m8\u001b[0m)    │      \u001b[38;5;34m3,080\u001b[0m │ batch_normalizat… │\n",
       "├─────────────────────┼───────────────────┼────────────┼───────────────────┤\n",
       "│ re_lu_7 (\u001b[38;5;33mReLU\u001b[0m)      │ (\u001b[38;5;45mNone\u001b[0m, \u001b[38;5;34m122\u001b[0m, \u001b[38;5;34m8\u001b[0m)    │          \u001b[38;5;34m0\u001b[0m │ conv1d_8[\u001b[38;5;34m0\u001b[0m][\u001b[38;5;34m0\u001b[0m]    │\n",
       "├─────────────────────┼───────────────────┼────────────┼───────────────────┤\n",
       "│ batch_normalizatio… │ (\u001b[38;5;45mNone\u001b[0m, \u001b[38;5;34m122\u001b[0m, \u001b[38;5;34m8\u001b[0m)    │         \u001b[38;5;34m32\u001b[0m │ re_lu_7[\u001b[38;5;34m0\u001b[0m][\u001b[38;5;34m0\u001b[0m]     │\n",
       "│ (\u001b[38;5;33mBatchNormalizatio…\u001b[0m │                   │            │                   │\n",
       "├─────────────────────┼───────────────────┼────────────┼───────────────────┤\n",
       "│ conv1d_6 (\u001b[38;5;33mConv1D\u001b[0m)   │ (\u001b[38;5;45mNone\u001b[0m, \u001b[38;5;34m122\u001b[0m, \u001b[38;5;34m8\u001b[0m)    │         \u001b[38;5;34m72\u001b[0m │ max_pooling1d_1[\u001b[38;5;34m…\u001b[0m │\n",
       "├─────────────────────┼───────────────────┼────────────┼───────────────────┤\n",
       "│ add_2 (\u001b[38;5;33mAdd\u001b[0m)         │ (\u001b[38;5;45mNone\u001b[0m, \u001b[38;5;34m122\u001b[0m, \u001b[38;5;34m8\u001b[0m)    │          \u001b[38;5;34m0\u001b[0m │ batch_normalizat… │\n",
       "│                     │                   │            │ conv1d_6[\u001b[38;5;34m0\u001b[0m][\u001b[38;5;34m0\u001b[0m]    │\n",
       "├─────────────────────┼───────────────────┼────────────┼───────────────────┤\n",
       "│ re_lu_8 (\u001b[38;5;33mReLU\u001b[0m)      │ (\u001b[38;5;45mNone\u001b[0m, \u001b[38;5;34m122\u001b[0m, \u001b[38;5;34m8\u001b[0m)    │          \u001b[38;5;34m0\u001b[0m │ add_2[\u001b[38;5;34m0\u001b[0m][\u001b[38;5;34m0\u001b[0m]       │\n",
       "├─────────────────────┼───────────────────┼────────────┼───────────────────┤\n",
       "│ batch_normalizatio… │ (\u001b[38;5;45mNone\u001b[0m, \u001b[38;5;34m122\u001b[0m, \u001b[38;5;34m8\u001b[0m)    │         \u001b[38;5;34m32\u001b[0m │ re_lu_8[\u001b[38;5;34m0\u001b[0m][\u001b[38;5;34m0\u001b[0m]     │\n",
       "│ (\u001b[38;5;33mBatchNormalizatio…\u001b[0m │                   │            │                   │\n",
       "├─────────────────────┼───────────────────┼────────────┼───────────────────┤\n",
       "│ max_pooling1d_2     │ (\u001b[38;5;45mNone\u001b[0m, \u001b[38;5;34m59\u001b[0m, \u001b[38;5;34m8\u001b[0m)     │          \u001b[38;5;34m0\u001b[0m │ batch_normalizat… │\n",
       "│ (\u001b[38;5;33mMaxPooling1D\u001b[0m)      │                   │            │                   │\n",
       "├─────────────────────┼───────────────────┼────────────┼───────────────────┤\n",
       "│ conv1d_10 (\u001b[38;5;33mConv1D\u001b[0m)  │ (\u001b[38;5;45mNone\u001b[0m, \u001b[38;5;34m59\u001b[0m, \u001b[38;5;34m128\u001b[0m)   │      \u001b[38;5;34m3,200\u001b[0m │ max_pooling1d_2[\u001b[38;5;34m…\u001b[0m │\n",
       "├─────────────────────┼───────────────────┼────────────┼───────────────────┤\n",
       "│ re_lu_9 (\u001b[38;5;33mReLU\u001b[0m)      │ (\u001b[38;5;45mNone\u001b[0m, \u001b[38;5;34m59\u001b[0m, \u001b[38;5;34m128\u001b[0m)   │          \u001b[38;5;34m0\u001b[0m │ conv1d_10[\u001b[38;5;34m0\u001b[0m][\u001b[38;5;34m0\u001b[0m]   │\n",
       "├─────────────────────┼───────────────────┼────────────┼───────────────────┤\n",
       "│ batch_normalizatio… │ (\u001b[38;5;45mNone\u001b[0m, \u001b[38;5;34m59\u001b[0m, \u001b[38;5;34m128\u001b[0m)   │        \u001b[38;5;34m512\u001b[0m │ re_lu_9[\u001b[38;5;34m0\u001b[0m][\u001b[38;5;34m0\u001b[0m]     │\n",
       "│ (\u001b[38;5;33mBatchNormalizatio…\u001b[0m │                   │            │                   │\n",
       "├─────────────────────┼───────────────────┼────────────┼───────────────────┤\n",
       "│ conv1d_11 (\u001b[38;5;33mConv1D\u001b[0m)  │ (\u001b[38;5;45mNone\u001b[0m, \u001b[38;5;34m59\u001b[0m, \u001b[38;5;34m8\u001b[0m)     │      \u001b[38;5;34m3,080\u001b[0m │ batch_normalizat… │\n",
       "├─────────────────────┼───────────────────┼────────────┼───────────────────┤\n",
       "│ re_lu_10 (\u001b[38;5;33mReLU\u001b[0m)     │ (\u001b[38;5;45mNone\u001b[0m, \u001b[38;5;34m59\u001b[0m, \u001b[38;5;34m8\u001b[0m)     │          \u001b[38;5;34m0\u001b[0m │ conv1d_11[\u001b[38;5;34m0\u001b[0m][\u001b[38;5;34m0\u001b[0m]   │\n",
       "├─────────────────────┼───────────────────┼────────────┼───────────────────┤\n",
       "│ batch_normalizatio… │ (\u001b[38;5;45mNone\u001b[0m, \u001b[38;5;34m59\u001b[0m, \u001b[38;5;34m8\u001b[0m)     │         \u001b[38;5;34m32\u001b[0m │ re_lu_10[\u001b[38;5;34m0\u001b[0m][\u001b[38;5;34m0\u001b[0m]    │\n",
       "│ (\u001b[38;5;33mBatchNormalizatio…\u001b[0m │                   │            │                   │\n",
       "├─────────────────────┼───────────────────┼────────────┼───────────────────┤\n",
       "│ conv1d_9 (\u001b[38;5;33mConv1D\u001b[0m)   │ (\u001b[38;5;45mNone\u001b[0m, \u001b[38;5;34m59\u001b[0m, \u001b[38;5;34m8\u001b[0m)     │         \u001b[38;5;34m72\u001b[0m │ max_pooling1d_2[\u001b[38;5;34m…\u001b[0m │\n",
       "├─────────────────────┼───────────────────┼────────────┼───────────────────┤\n",
       "│ add_3 (\u001b[38;5;33mAdd\u001b[0m)         │ (\u001b[38;5;45mNone\u001b[0m, \u001b[38;5;34m59\u001b[0m, \u001b[38;5;34m8\u001b[0m)     │          \u001b[38;5;34m0\u001b[0m │ batch_normalizat… │\n",
       "│                     │                   │            │ conv1d_9[\u001b[38;5;34m0\u001b[0m][\u001b[38;5;34m0\u001b[0m]    │\n",
       "├─────────────────────┼───────────────────┼────────────┼───────────────────┤\n",
       "│ re_lu_11 (\u001b[38;5;33mReLU\u001b[0m)     │ (\u001b[38;5;45mNone\u001b[0m, \u001b[38;5;34m59\u001b[0m, \u001b[38;5;34m8\u001b[0m)     │          \u001b[38;5;34m0\u001b[0m │ add_3[\u001b[38;5;34m0\u001b[0m][\u001b[38;5;34m0\u001b[0m]       │\n",
       "├─────────────────────┼───────────────────┼────────────┼───────────────────┤\n",
       "│ batch_normalizatio… │ (\u001b[38;5;45mNone\u001b[0m, \u001b[38;5;34m59\u001b[0m, \u001b[38;5;34m8\u001b[0m)     │         \u001b[38;5;34m32\u001b[0m │ re_lu_11[\u001b[38;5;34m0\u001b[0m][\u001b[38;5;34m0\u001b[0m]    │\n",
       "│ (\u001b[38;5;33mBatchNormalizatio…\u001b[0m │                   │            │                   │\n",
       "├─────────────────────┼───────────────────┼────────────┼───────────────────┤\n",
       "│ max_pooling1d_3     │ (\u001b[38;5;45mNone\u001b[0m, \u001b[38;5;34m28\u001b[0m, \u001b[38;5;34m8\u001b[0m)     │          \u001b[38;5;34m0\u001b[0m │ batch_normalizat… │\n",
       "│ (\u001b[38;5;33mMaxPooling1D\u001b[0m)      │                   │            │                   │\n",
       "├─────────────────────┼───────────────────┼────────────┼───────────────────┤\n",
       "│ conv1d_13 (\u001b[38;5;33mConv1D\u001b[0m)  │ (\u001b[38;5;45mNone\u001b[0m, \u001b[38;5;34m28\u001b[0m, \u001b[38;5;34m128\u001b[0m)   │      \u001b[38;5;34m3,200\u001b[0m │ max_pooling1d_3[\u001b[38;5;34m…\u001b[0m │\n",
       "├─────────────────────┼───────────────────┼────────────┼───────────────────┤\n",
       "│ re_lu_12 (\u001b[38;5;33mReLU\u001b[0m)     │ (\u001b[38;5;45mNone\u001b[0m, \u001b[38;5;34m28\u001b[0m, \u001b[38;5;34m128\u001b[0m)   │          \u001b[38;5;34m0\u001b[0m │ conv1d_13[\u001b[38;5;34m0\u001b[0m][\u001b[38;5;34m0\u001b[0m]   │\n",
       "├─────────────────────┼───────────────────┼────────────┼───────────────────┤\n",
       "│ batch_normalizatio… │ (\u001b[38;5;45mNone\u001b[0m, \u001b[38;5;34m28\u001b[0m, \u001b[38;5;34m128\u001b[0m)   │        \u001b[38;5;34m512\u001b[0m │ re_lu_12[\u001b[38;5;34m0\u001b[0m][\u001b[38;5;34m0\u001b[0m]    │\n",
       "│ (\u001b[38;5;33mBatchNormalizatio…\u001b[0m │                   │            │                   │\n",
       "├─────────────────────┼───────────────────┼────────────┼───────────────────┤\n",
       "│ conv1d_14 (\u001b[38;5;33mConv1D\u001b[0m)  │ (\u001b[38;5;45mNone\u001b[0m, \u001b[38;5;34m28\u001b[0m, \u001b[38;5;34m8\u001b[0m)     │      \u001b[38;5;34m3,080\u001b[0m │ batch_normalizat… │\n",
       "├─────────────────────┼───────────────────┼────────────┼───────────────────┤\n",
       "│ re_lu_13 (\u001b[38;5;33mReLU\u001b[0m)     │ (\u001b[38;5;45mNone\u001b[0m, \u001b[38;5;34m28\u001b[0m, \u001b[38;5;34m8\u001b[0m)     │          \u001b[38;5;34m0\u001b[0m │ conv1d_14[\u001b[38;5;34m0\u001b[0m][\u001b[38;5;34m0\u001b[0m]   │\n",
       "├─────────────────────┼───────────────────┼────────────┼───────────────────┤\n",
       "│ batch_normalizatio… │ (\u001b[38;5;45mNone\u001b[0m, \u001b[38;5;34m28\u001b[0m, \u001b[38;5;34m8\u001b[0m)     │         \u001b[38;5;34m32\u001b[0m │ re_lu_13[\u001b[38;5;34m0\u001b[0m][\u001b[38;5;34m0\u001b[0m]    │\n",
       "│ (\u001b[38;5;33mBatchNormalizatio…\u001b[0m │                   │            │                   │\n",
       "├─────────────────────┼───────────────────┼────────────┼───────────────────┤\n",
       "│ conv1d_12 (\u001b[38;5;33mConv1D\u001b[0m)  │ (\u001b[38;5;45mNone\u001b[0m, \u001b[38;5;34m28\u001b[0m, \u001b[38;5;34m8\u001b[0m)     │         \u001b[38;5;34m72\u001b[0m │ max_pooling1d_3[\u001b[38;5;34m…\u001b[0m │\n",
       "├─────────────────────┼───────────────────┼────────────┼───────────────────┤\n",
       "│ add_4 (\u001b[38;5;33mAdd\u001b[0m)         │ (\u001b[38;5;45mNone\u001b[0m, \u001b[38;5;34m28\u001b[0m, \u001b[38;5;34m8\u001b[0m)     │          \u001b[38;5;34m0\u001b[0m │ batch_normalizat… │\n",
       "│                     │                   │            │ conv1d_12[\u001b[38;5;34m0\u001b[0m][\u001b[38;5;34m0\u001b[0m]   │\n",
       "├─────────────────────┼───────────────────┼────────────┼───────────────────┤\n",
       "│ re_lu_14 (\u001b[38;5;33mReLU\u001b[0m)     │ (\u001b[38;5;45mNone\u001b[0m, \u001b[38;5;34m28\u001b[0m, \u001b[38;5;34m8\u001b[0m)     │          \u001b[38;5;34m0\u001b[0m │ add_4[\u001b[38;5;34m0\u001b[0m][\u001b[38;5;34m0\u001b[0m]       │\n",
       "├─────────────────────┼───────────────────┼────────────┼───────────────────┤\n",
       "│ batch_normalizatio… │ (\u001b[38;5;45mNone\u001b[0m, \u001b[38;5;34m28\u001b[0m, \u001b[38;5;34m8\u001b[0m)     │         \u001b[38;5;34m32\u001b[0m │ re_lu_14[\u001b[38;5;34m0\u001b[0m][\u001b[38;5;34m0\u001b[0m]    │\n",
       "│ (\u001b[38;5;33mBatchNormalizatio…\u001b[0m │                   │            │                   │\n",
       "├─────────────────────┼───────────────────┼────────────┼───────────────────┤\n",
       "│ max_pooling1d_4     │ (\u001b[38;5;45mNone\u001b[0m, \u001b[38;5;34m12\u001b[0m, \u001b[38;5;34m8\u001b[0m)     │          \u001b[38;5;34m0\u001b[0m │ batch_normalizat… │\n",
       "│ (\u001b[38;5;33mMaxPooling1D\u001b[0m)      │                   │            │                   │\n",
       "├─────────────────────┼───────────────────┼────────────┼───────────────────┤\n",
       "│ flatten (\u001b[38;5;33mFlatten\u001b[0m)   │ (\u001b[38;5;45mNone\u001b[0m, \u001b[38;5;34m96\u001b[0m)        │          \u001b[38;5;34m0\u001b[0m │ max_pooling1d_4[\u001b[38;5;34m…\u001b[0m │\n",
       "├─────────────────────┼───────────────────┼────────────┼───────────────────┤\n",
       "│ dense (\u001b[38;5;33mDense\u001b[0m)       │ (\u001b[38;5;45mNone\u001b[0m, \u001b[38;5;34m8\u001b[0m)         │        \u001b[38;5;34m776\u001b[0m │ flatten[\u001b[38;5;34m0\u001b[0m][\u001b[38;5;34m0\u001b[0m]     │\n",
       "├─────────────────────┼───────────────────┼────────────┼───────────────────┤\n",
       "│ dropout (\u001b[38;5;33mDropout\u001b[0m)   │ (\u001b[38;5;45mNone\u001b[0m, \u001b[38;5;34m8\u001b[0m)         │          \u001b[38;5;34m0\u001b[0m │ dense[\u001b[38;5;34m0\u001b[0m][\u001b[38;5;34m0\u001b[0m]       │\n",
       "├─────────────────────┼───────────────────┼────────────┼───────────────────┤\n",
       "│ dense_1 (\u001b[38;5;33mDense\u001b[0m)     │ (\u001b[38;5;45mNone\u001b[0m, \u001b[38;5;34m128\u001b[0m)       │      \u001b[38;5;34m1,152\u001b[0m │ dropout[\u001b[38;5;34m0\u001b[0m][\u001b[38;5;34m0\u001b[0m]     │\n",
       "├─────────────────────┼───────────────────┼────────────┼───────────────────┤\n",
       "│ dropout_1 (\u001b[38;5;33mDropout\u001b[0m) │ (\u001b[38;5;45mNone\u001b[0m, \u001b[38;5;34m128\u001b[0m)       │          \u001b[38;5;34m0\u001b[0m │ dense_1[\u001b[38;5;34m0\u001b[0m][\u001b[38;5;34m0\u001b[0m]     │\n",
       "├─────────────────────┼───────────────────┼────────────┼───────────────────┤\n",
       "│ dense_2 (\u001b[38;5;33mDense\u001b[0m)     │ (\u001b[38;5;45mNone\u001b[0m, \u001b[38;5;34m4\u001b[0m)         │        \u001b[38;5;34m516\u001b[0m │ dropout_1[\u001b[38;5;34m0\u001b[0m][\u001b[38;5;34m0\u001b[0m]   │\n",
       "└─────────────────────┴───────────────────┴────────────┴───────────────────┘\n"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "text/html": [
       "<pre style=\"white-space:pre;overflow-x:auto;line-height:normal;font-family:Menlo,'DejaVu Sans Mono',consolas,'Courier New',monospace\"><span style=\"font-weight: bold\"> Total params: </span><span style=\"color: #00af00; text-decoration-color: #00af00\">38,654</span> (151.00 KB)\n",
       "</pre>\n"
      ],
      "text/plain": [
       "\u001b[1m Total params: \u001b[0m\u001b[38;5;34m38,654\u001b[0m (151.00 KB)\n"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "text/html": [
       "<pre style=\"white-space:pre;overflow-x:auto;line-height:normal;font-family:Menlo,'DejaVu Sans Mono',consolas,'Courier New',monospace\"><span style=\"font-weight: bold\"> Trainable params: </span><span style=\"color: #00af00; text-decoration-color: #00af00\">37,212</span> (145.36 KB)\n",
       "</pre>\n"
      ],
      "text/plain": [
       "\u001b[1m Trainable params: \u001b[0m\u001b[38;5;34m37,212\u001b[0m (145.36 KB)\n"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "text/html": [
       "<pre style=\"white-space:pre;overflow-x:auto;line-height:normal;font-family:Menlo,'DejaVu Sans Mono',consolas,'Courier New',monospace\"><span style=\"font-weight: bold\"> Non-trainable params: </span><span style=\"color: #00af00; text-decoration-color: #00af00\">1,440</span> (5.62 KB)\n",
       "</pre>\n"
      ],
      "text/plain": [
       "\u001b[1m Non-trainable params: \u001b[0m\u001b[38;5;34m1,440\u001b[0m (5.62 KB)\n"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "text/html": [
       "<pre style=\"white-space:pre;overflow-x:auto;line-height:normal;font-family:Menlo,'DejaVu Sans Mono',consolas,'Courier New',monospace\"><span style=\"font-weight: bold\"> Optimizer params: </span><span style=\"color: #00af00; text-decoration-color: #00af00\">2</span> (12.00 B)\n",
       "</pre>\n"
      ],
      "text/plain": [
       "\u001b[1m Optimizer params: \u001b[0m\u001b[38;5;34m2\u001b[0m (12.00 B)\n"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "None\n"
     ]
    }
   ],
   "source": [
    "# src\\Models\\RES_W500_T04.h5\n",
    "model = keras.models.load_model(\"src\\Models\\RES_W500_T04.h5\")\n",
    "print(model.summary())"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 12,
   "id": "a8f60af0",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "\u001b[1m339/339\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m3s\u001b[0m 8ms/step\n",
      "Classification Report (Test Data):\n",
      "              precision    recall  f1-score   support\n",
      "\n",
      "           0       0.66      0.82      0.73      1008\n",
      "           1       0.28      0.97      0.44       229\n",
      "           2       0.26      0.95      0.40       456\n",
      "           3       1.00      0.77      0.87      9141\n",
      "\n",
      "    accuracy                           0.79     10834\n",
      "   macro avg       0.55      0.88      0.61     10834\n",
      "weighted avg       0.92      0.79      0.83     10834\n",
      "\n",
      "AUC: 0.9662301271787019\n"
     ]
    },
    {
     "data": {
      "image/png": "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AQAAQFAIAADg8OJ//8bkyZNVuHBhpU+fXtWqVdPGjRtvWf/TTz9V6dKlbf3y5ctr2bJl8X5NgkIAAIAkZMGCBerbt6+GDBmiLVu2qGLFimrYsKFOnTrlsf7atWvVunVrde7cWb/88ouaN29ut507d8brdR1Op9OpFCb8UoSvmwDAS85cuObrJiAR1RoY/2wHkq/j7z3qs9e+8rf3rp0+njM4TGbwnnvu0aRJk+x+ZGSkChQooJ49e2rAgAE31W/VqpUuXryopUuXusruvfdeBQcHa9q0aXF+XTKFAAAAXnT16lWdP3/ebTNlnly7dk2bN29W/fr1XWV+fn52f926dR7PMeXR6xsmsxhb/VQ1+zh7Rn+lNuYP18iRIxUSEqKAgABfNwdelpqfd/aMGZTapObn7cvMka+k5uftS+m9GBENfX2khg0b5lZmuoaHDh16U92wsDBFREQod+7cbuVmf+/evR6vf+LECY/1TXl8kClMQX+JmD9wsf3mgZSF55268LxTF553yhMSEqJz5865baYsqUmRmUIAAICkIiAgIM5Z36CgIPn7++vkyZNu5WY/T548Hs8x5fGpHxsyhQAAAElEunTpVLlyZa1atcpVZiaamP3q1at7PMeUR69vfPPNN7HWjw2ZQgAAgCTELEfTsWNHValSRVWrVtW4cePs7OJOnTrZ4x06dFC+fPns2FOjd+/eql27tt555x09/PDDmj9/vn7++We999578XpdgsIUwqSlzaBVBiWnDjzv1IXnnbrwvNGqVSuFhoZq8ODBdrKIWVpm+fLlrskkR48etTOSo9SoUUPz5s3TwIED9corr6hEiRJasmSJypUrF6/XTZHrFAIAACB+GFMIAAAAgkIAAAAQFAIAAICgEAAAAAZBYQoxefJkFS5cWOnTp7cfpL1x40ZfNwle8OOPP6pJkya688475XA47OwypFxmuYl77rlHmTNnVq5cudS8eXPt27fP182Cl0ydOlUVKlRQlixZ7GbWmPv666993SykIgSFKcCCBQvsmkZmCYMtW7aoYsWK9oOwT5065eumIYGZdarM8zW/BCDl++GHH9SjRw+tX7/eLkR7/fp1NWjQwP45QMqTP39+vfnmm9q8ebNdY65u3bpq1qyZdu3a5eumIZVgSZoUwGQGTTZh0qRJrpXPCxQooJ49e2rAgAG+bh68xGQKP/vsM5s9Qupg1i0zGUMTLN5///2+bg4SQY4cOTR69Gh17tzZ101BKkCmMJm7du2a/a2yfv36rjKzoKXZX7dunU/bBiBhnTt3zhUoIGWLiIiwn0phssLx/agy4N/iE02SubCwMPuXR9Qq51HM/t69e33WLgAJy/QAvPDCC6pZs2a8P6UAyceOHTtsEHjlyhVlypTJ9gaULVvW181CKkFQCADJgBlbuHPnTq1Zs8bXTYEXlSpVSlu3brVZ4YULF9rPvzXDBQgMkRgICpO5oKAg+fv76+TJk27lZj9Pnjw+axeAhPP8889r6dKldva5mYyAlCtdunQqXry4/b5y5cratGmTxo8fr3fffdfXTUMqwJjCFPAXiPmLY9WqVW7dTGafcShA8mbmAZqA0HQhrl69WkWKFPF1k5DIzN/nV69e9XUzkEqQKUwBzHI0pouhSpUqqlq1qsaNG2cHJ3fq1MnXTUMCu3Dhgg4cOODaP3TokO1qMhMPChYs6NO2wTtdxvPmzdPnn39u1yo8ceKELc+aNasyZMjg6+YhgYWEhOihhx6yP8t//fWXffbff/+9VqxY4eumIZVgSZoUwixHY5YtMP9oBAcHa8KECXapGqQs5h+IOnXq3FRufin46KOPfNImeHfZIU9mzJihp556KtHbA+8yy86YXp7jx4/bwN8sZN2/f389+OCDvm4aUgmCQgAAADCmEAAAAASFAAAAICgEAACAQVAIAAAAgkIAAAAQFAIAAICgEAAAAAZBIQAAAAgKAfx75lM1mjdv7tp/4IEH9MILL/jkk17Mp3+cPXs20e41qbYTAP4tgkIghTHBiwk8zJYuXToVL15cw4cP199//+311168eLFee+21JBkgFS5c2H4uOADAszSxlANIxho1amQ/H/fq1atatmyZevToobRp0yokJOSmuteuXbPBY0LIkSNHglwHAJD4yBQCKVBAQIDy5MmjQoUKqVu3bqpfv76++OILt27QN954Q3feeadKlSply3///Xc98cQTypYtmw3umjVrpsOHD7uuGRERob59+9rjgYGBevnllxXzo9Njdh+boLR///4qUKCAbZPJWn7wwQf2unXq1LF1smfPbjOGpl1GZGSkRo4cqSJFiihDhgyqWLGiFi5c6PY6JtAtWbKkPW6uE72d/4a5t86dO7te07wn48eP91h32LBhypkzp7JkyaLnnnvOBtVR4tL26I4cOaImTZrY9+COO+7QXXfdZe8NAHyBTCGQCpgA5fTp0679VatW2aDmm2++sfvXr19Xw4YNVb16df30009KkyaNXn/9dZtx3L59u80kvvPOO/roo4/04YcfqkyZMnb/s88+U926dWN93Q4dOmjdunWaMGGCDZAOHTqksLAwGyQuWrRIjz76qPbt22fbYtpomKBqzpw5mjZtmkqUKKEff/xR7dq1s4FY7dq1bfDasmVLm/185pln9PPPP+vFF1/8T++PCeby58+vTz/91Aa8a9eutdfOmzevDZSjv2/p06e3Xd8mEO3UqZOtbwLsuLQ9JnMPJqg09UxQuHv3bmXKlOk/3QsA/GtOAClKx44dnc2aNbPfR0ZGOr/55htnQECAs1+/fq7juXPndl69etV1zuzZs52lSpWy9aOY4xkyZHCuWLHC7ufNm9c5atQo1/Hr16878+fP73oto3bt2s7evXvb7/ft22fSiPb1Pfnuu+/s8fDwcFfZlStXnBkzZnSuXbvWrW7nzp2drVu3tt+HhIQ4y5Yt63a8f//+N10rpkKFCjnHjh3rjKsePXo4H330Ude+ed9y5MjhvHjxoqts6tSpzkyZMjkjIiLi1PaY91y+fHnn0KFD49wmAPAmMoVACrR06VKbcTIZQJMFa9OmjYYOHeo6Xr58ebdxhNu2bdOBAweUOXNmt+tcuXJFv/32m86dO6fjx4+rWrVqrmMmm1ilSpWbupCjbN26Vf7+/h4zZLExbbh06ZIefPBBt3KTTatUqZL9fs+ePW7tMEyG87+aPHmyzYIePXpUly9ftq8ZHBzsVsdkOzNmzOj2uhcuXLDZS/P1dm2PqVevXrZ7f+XKlbaL32ROK1So8J/vBQD+DYJCIAUy4+ymTp1qAz8zbtAEcNGZrsroTEBTuXJlzZ0796Zrma7PfyOqOzg+TDuMr776Svny5XM7ZsYkesv8+fPVr18/2yVuAj0THI8ePVobNmzwatu7dOliu+3NOSYwNN3Ppg09e/b8j3cEAPFHUAikQCboM5M64uruu+/WggULlCtXLju+zxMzvs4ESffff7/dN0vcbN682Z7riclGmizlDz/8YLNgMUVlKs0kjyhly5a1AZTJ1sWWYTTjGaMmzURZv369/ov//e9/qlGjhrp37+4qMxnSmExG1WQRowJe87omI2vGSJrJObdruyfmXDNhxWxmdvj06dMJCgH4BLOPAaht27YKCgqyM47NRBMzIcRMpjDdm3/88Yet07t3b7355ptasmSJ9u7dawOoW60xaNYF7Nixo55++ml7TtQ1P/nkE3vczIw2s45NV3doaKjNtJkMncnY9enTRzNnzrSB2ZYtWzRx4kS7b5jg6ddff9VLL71kJ6nMmzfPToCJi2PHjtlu7ehbeHi4nRRiJqysWLFC+/fv16BBg7Rp06abzjddwWaWspkQYmYJDxkyRM8//7z8/Pzi1PaYzExt85rmvTF1v/vuOxv0AoBPeHXEIgCfTjSJz/Hjx487O3To4AwKCrITU4oWLers2rWr89y5c66JJWYSSZYsWZzZsmVz9u3b19aPbaKJcfnyZWefPn3sJJV06dI5ixcv7vzwww9dx4cPH+7MkyeP0+Fw2HYZZrLLuHHj7MSXtGnTOnPmzOls2LCh84cffnCd9+WXX9prmXbed9999ppxmWhi6sTczCQbM0nkqaeecmbNmtXeW7du3ZwDBgxwVqxY8ab3bfDgwc7AwEA7wcS8P+bcKLdre8yJJs8//7yzWLFi9j5M3fbt2zvDwsJu+XwBwFsc5n++CUcBAACQVNB9DAAAAIJCAAAAEBQCAACAoBAAAAAGQSEAAAAICgEAAEBQCAAAAIJCAAAAGASFAAAAICgEAAAAQSEAAIAg/R9spwSNS5PPbQAAAABJRU5ErkJggg==",
      "text/plain": [
       "<Figure size 800x600 with 2 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "# Get model predictions (probabilities)\n",
    "y_pred = model.predict(norm_X)\n",
    "\n",
    "# Convert to class predictions using argmax since this is multi-class with 4 outputs\n",
    "y_pred_class = np.argmax(y_pred, axis=1)\n",
    "\n",
    "# Calculate metrics\n",
    "print(\"Classification Report (Test Data):\")\n",
    "print(sklearn.metrics.classification_report(y_test, y_pred_class))\n",
    "\n",
    "# For multi-class ROC AUC score, use OVR (One-vs-Rest) approach\n",
    "auc = sklearn.metrics.roc_auc_score(y_test, y_pred, multi_class='ovr')\n",
    "print(f\"AUC: {auc}\")\n",
    "\n",
    "# Generate normalized confusion matrix\n",
    "cm = sklearn.metrics.confusion_matrix(y_test, y_pred_class, normalize='true')\n",
    "\n",
    "# Plot confusion matrix\n",
    "plt.figure(figsize=(8, 6))\n",
    "sns.heatmap(cm, annot=True, fmt=\".2f\", cmap=\"Blues\", xticklabels=[0, 1, 2, 3], yticklabels=[0, 1, 2, 3])\n",
    "plt.xlabel('Predicted Labels')\n",
    "plt.ylabel('True Labels')\n",
    "plt.title('Confusion Matrix')\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 12,
   "id": "e1890b14",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "40\n",
      "40\n",
      "(500, 12)\n"
     ]
    }
   ],
   "source": [
    "data_labels_0 = [y for y in y_test[:10]]\n",
    "data_labels_1 = [y for y in y_test[1008:1018]]\n",
    "data_labels_2 = [y for y in y_test[1237:1247]]\n",
    "data_labels_3 = [y for y in y_test[1693:1703]]\n",
    "data_labels_list = data_labels_0 + data_labels_1 + data_labels_2 + data_labels_3\n",
    "print(len(data_labels_list))\n",
    "\n",
    "data_list_0 = [x for x in norm_X[:10]]\n",
    "data_list_1 = [x for x in norm_X[1008:1018]]\n",
    "data_list_2 = [x for x in norm_X[1237:1247]]\n",
    "data_list_3 = [x for x in norm_X[1693:1703]]\n",
    "data_list = data_list_0 + data_list_1 + data_list_2 + data_list_3\n",
    "print(len(data_list))\n",
    "print(data_list[0].shape)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 14,
   "id": "4bc3ad9a",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "['0', '1', '2', '3', '4', '5', '6', '7', '8', '9', '1008', '1009', '1010', '1011', '1012', '1013', '1014', '1015', '1016', '1017', '1237', '1238', '1239', '1240', '1241', '1242', '1243', '1244', '1245', '1246', '1693', '1694', '1695', '1696', '1697', '1698', '1699', '1700', '1701', '1702']\n"
     ]
    }
   ],
   "source": [
    "ls0 = [str(i) for i in range(10)]\n",
    "ls1 = [str(i) for i in range(1008,1018)]\n",
    "ls2 = [str(i) for i in range(1237,1247)]\n",
    "ls3 = [str(i) for i in range(1693,1703)]\n",
    "item_names = ls0 + ls1 + ls2 + ls3\n",
    "print(item_names)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "3085af77",
   "metadata": {},
   "outputs": [],
   "source": [
    "target_classes = [0, 1, 2, 3]\n",
    "class_labels = [\"Atrial Fibrillation\", \"Supraventricular Tachycardia\", \"Sinus Bradycardia\", \"Sinus Rhythm\"]\n",
    "# Draw CAMs\n",
    "cam_builder = TfCamBuilder(model, class_names=class_labels, time_axs=0)\n",
    "target_layers_names = [\"conv1d_12\"]\n",
    "cams, predicted_probs_dict, bar_ranges = cam_builder.get_cam(data_list, data_labels=data_labels_list,\n",
    "                                                        target_classes=target_classes,\n",
    "                                                        explainer_types=\"Grad-CAM\",\n",
    "                                                        target_layers=target_layers_names, softmax_final=False,\n",
    "                                                        data_names=item_names, data_sampling_freq=50, dt=1, results_dir_path=\"./output_cams\")\n",
    "\n",
    "# Explain different input channels\n",
    "comparison_algorithm = \"Grad-CAM\"\n",
    "for i in range(12):\n",
    "    selected_channels_indices = [i]\n",
    "    cam_builder.single_channel_output_display(data_list=data_list, data_labels=data_labels_list,\n",
    "                                                predicted_probs_dict=predicted_probs_dict, cams_dict=cams,\n",
    "                                                explainer_types=comparison_algorithm, target_classes=target_classes,\n",
    "                                                target_layers=target_layers_names, desired_channels=selected_channels_indices,\n",
    "                                                data_names=item_names, fig_size=(20, 10), grid_instructions=(1, len(selected_channels_indices)),\n",
    "                                                bar_ranges_dict=bar_ranges,\n",
    "                                                results_dir_path=f\"./output_cams/channel_{i}\", data_sampling_freq=50, dt=1,\n",
    "                                                line_width=0.5, marker_width=30,\n",
    "                                                axes_names=(None, None))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "b084c76c",
   "metadata": {},
   "outputs": [],
   "source": [
    "# --- Config ---\n",
    "excel_path = \"./Data/Label_Map.xlsx\"           # path to your Excel file\n",
    "ecg_dir = \"./Data/ECGDataDenoised/\"              # directory with ECG .csv files\n",
    "samples_per_class = 15\n",
    "expected_leads = 12\n",
    "expected_length = 500                # adjust if your ECGs are a different length\n",
    "\n",
    "# Optional: seed for reproducibility\n",
    "np.random.seed(42)\n",
    "\n",
    "# --- Load labels ---\n",
    "df = pd.read_excel(excel_path)\n",
    "print(df.shape)\n",
    "assert 'FileName' in df.columns and 'Rhythm' in df.columns\n",
    "\n",
    "# --- Stratified sample ---\n",
    "sampled_df = df.groupby('Rhythm', group_keys=False).apply(lambda x: x.sample(n=samples_per_class, random_state=42))\n",
    "print(sampled_df.shape)\n",
    "\n",
    "# --- Load ECGs ---\n",
    "background_data = []\n",
    "\n",
    "for _, row in sampled_df.iterrows():\n",
    "    name = str(row['FileName']) + '.csv'\n",
    "    filepath = os.path.join(ecg_dir, name)\n",
    "    \n",
    "    if not os.path.exists(filepath):\n",
    "        print(f\"Skipping missing file: {filepath}\")\n",
    "        continue\n",
    "    \n",
    "    ecg = pd.read_csv(filepath, header=None).values\n",
    "    \n",
    "    # Transpose if necessary\n",
    "    if ecg.shape[0] == expected_length and ecg.shape[1] == expected_leads:\n",
    "        background_data.append(ecg)\n",
    "\n",
    "# --- Stack into array ---\n",
    "background_array = np.stack(background_data)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "4398cea9",
   "metadata": {},
   "outputs": [],
   "source": [
    "from Modules.windowshap import SlidingWindowSHAP\n",
    "test_data = norm_X[:1]\n",
    "print(test_data.shape)\n",
    "gtw = SlidingWindowSHAP(model, stride=25, window_len=50, B_ts=background_array, test_ts=test_data, model_type='lstm')\n",
    "maps = gtw.shap_values(num_output=4)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "1e7b6133",
   "metadata": {},
   "outputs": [],
   "source": [
    "from Modules.windowshap import DynamicWindowSHAP\n",
    "test_data = norm_X[:1]\n",
    "print(test_data.shape)\n",
    "delta = 0.3\n",
    "n_w = 8\n",
    "btw = DynamicWindowSHAP(model, delta, n_w, background_array, test_data, model_type='lstm')\n",
    "maps_dyn = gtw.shap_values(num_output=4)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "47ceb365",
   "metadata": {},
   "outputs": [],
   "source": [
    "def heat_map(start, stop, x, shap_values, var_name='Feature 1', plot_type='bar', title=None):\n",
    "    \"\"\"\n",
    "    A function that generates a heatmap with the temporal sequence alongside its Shapley values\n",
    "\n",
    "    Parameters\n",
    "    ----------\n",
    "    start (int): the starting point of the temporal sequence\n",
    "    stop (int): the ending point of the temporal sequence\n",
    "    x (np.ndarray): the sequence data\n",
    "    shap_values (np.ndarray): the Shapley values corresponding to the sequence data\n",
    "    var_name (str): the name of the variable being plotted (default: 'Feature 1')\n",
    "    plot_type (str): the type of plot to generate ('bar' or 'heat' or 'heat_abs', default: 'bar')\n",
    "    title (str): the title for the plot (default: None)\n",
    "    \"\"\"\n",
    "    import matplotlib.pyplot as plt\n",
    "    from matplotlib.colors import LinearSegmentedColormap\n",
    "    from matplotlib.colors import BoundaryNorm\n",
    "    from textwrap import wrap\n",
    "    import numpy as np; np.random.seed(1)\n",
    "    \n",
    "    ## ColorMap-------------------------\n",
    "    # define the colormap\n",
    "    cmap = plt.get_cmap('PuOr_r')\n",
    "\n",
    "    # extract all colors from the .jet map\n",
    "    cmaplist = [cmap(i) for i in range(cmap.N)]\n",
    "    # create the new map\n",
    "    cmap = cmap.from_list('Custom cmap', cmaplist, cmap.N)\n",
    "\n",
    "    # define the bins and normalize and forcing 0 to be part of the colorbar!\n",
    "    bounds = np.arange(np.min(shap_values),np.max(shap_values),.005)\n",
    "    idx=np.searchsorted(bounds,0)\n",
    "    bounds=np.insert(bounds,idx,0)\n",
    "    norm = BoundaryNorm(bounds, cmap.N)\n",
    "    ##------------------------------------\n",
    "    \n",
    "    if title is None: title = '\\n'.join(wrap('{} values and contribution scores'.format(var_name), width=40))\n",
    "    \n",
    "    if plot_type=='heat' or plot_type=='heat_abs':\n",
    "        plt.rcParams[\"figure.figsize\"] = 9,3\n",
    "        if plot_type=='heat_abs':\n",
    "            shap_values = np.absolute(shap_values)\n",
    "            cmap = 'Reds'\n",
    "        fig, ax1 = plt.subplots(sharex=True)\n",
    "        extent = [start, stop, -2, 2]\n",
    "        im1 = ax1.imshow(shap_values[np.newaxis, :], cmap=cmap, norm=norm, aspect=\"auto\", extent=extent)\n",
    "        ax1.set_yticks([])\n",
    "        ax1.set_xlim(extent[0], extent[1])\n",
    "        ax1.title.set_text(title)\n",
    "        fig.colorbar(im1, ax=ax1, pad=0.1)\n",
    "        ax2 = ax1.twinx()\n",
    "        ax2.plot(np.arange(start, stop), x, color='black')\n",
    "    elif plot_type=='bar':\n",
    "        plt.rcParams[\"figure.figsize\"] = 8.5,2.5\n",
    "        fig, ax1 = plt.subplots(sharex=True)\n",
    "        mask1 = shap_values < 0\n",
    "        mask2 = shap_values >= 0\n",
    "        ax1.bar(np.arange(start, stop)[mask1], shap_values[mask1], color='blue', label='Negative Shapley values')\n",
    "        ax1.bar(np.arange(start, stop)[mask2], shap_values[mask2], color='red', label='Positive Shapley values')\n",
    "        ax1.set_title(title)\n",
    "        ax2 = ax1.twinx()\n",
    "        ax2.plot(np.arange(start, stop), x, 'k-', label='Observed data')\n",
    "        # legends\n",
    "        lines, labels = ax1.get_legend_handles_labels()\n",
    "        lines2, labels2 = ax2.get_legend_handles_labels()\n",
    "        # ax2.legend(lines + lines2, labels + labels2, loc=0)\n",
    "    \n",
    "    ax1.set_xlabel('Time steps')\n",
    "    if plot_type=='bar': ax1.set_ylabel('Shapley values')\n",
    "    ax2.set_ylabel(var_name + ' data values')\n",
    "    plt.tight_layout()\n",
    "    plt.show()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "80851f91",
   "metadata": {},
   "outputs": [],
   "source": [
    "var = 0\n",
    "heat_map(start=0, stop=500, x=norm_X[0, :, var],\n",
    "         shap_values=maps[0, :, var], var_name='Variable', plot_type='bar')"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "83612f93",
   "metadata": {},
   "outputs": [],
   "source": [
    "heat_map(start=0, stop=500, x=norm_X[0, :, var],\n",
    "         shap_values=maps_dyn[0, :, var], var_name='Variable', plot_type='bar')"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 11,
   "id": "a4504fce",
   "metadata": {},
   "outputs": [],
   "source": [
    "def load_and_evaluate_models(directory_path, X_test, y_test):\n",
    "    directory = Path(directory_path)\n",
    "    model_files = list(directory.glob(\"*.keras\")) + list(directory.glob(\"*.h5\"))\n",
    "    \n",
    "    print(f\"🔍 Found {len(model_files)} model(s) in {directory_path}\\n\")\n",
    "\n",
    "    for file_path in model_files:\n",
    "        try:\n",
    "            print(f\"📦 Loading model: {file_path.name}\")\n",
    "            model = keras.models.load_model(file_path)\n",
    "            \n",
    "            y_pred = model.predict(X_test)\n",
    "            y_pred_class = np.argmax(y_pred, axis=1)\n",
    "\n",
    "            print(f\"Classification Report {file_path.name}:\")\n",
    "            print(sklearn.metrics.classification_report(y_test, y_pred_class))\n",
    "\n",
    "            auc = sklearn.metrics.roc_auc_score(y_test, y_pred, multi_class='ovr')\n",
    "            print(f\"AUC ({file_path.name}): {auc}\")\n",
    "            \n",
    "            print(f\"✅ Evaluation for {file_path.name} completed.\")\n",
    "\n",
    "        except Exception as e:\n",
    "            print(f\"❌ Error loading/evaluating {file_path.name}: {e}\")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 12,
   "id": "c3d76d3e",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "🔍 Found 15 model(s) in src\\Models\n",
      "\n",
      "📦 Loading model: C_RES_500_3.keras\n",
      "\u001b[1m339/339\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m10s\u001b[0m 27ms/step\n",
      "Classification Report C_RES_500_3.keras:\n",
      "              precision    recall  f1-score   support\n",
      "\n",
      "           0       0.02      0.00      0.01      1008\n",
      "           1       0.02      1.00      0.04       229\n",
      "           2       0.29      0.16      0.21       456\n",
      "           3       1.00      0.00      0.00      9141\n",
      "\n",
      "    accuracy                           0.03     10834\n",
      "   macro avg       0.33      0.29      0.07     10834\n",
      "weighted avg       0.86      0.03      0.01     10834\n",
      "\n",
      "AUC (C_RES_500_3.keras): 0.6407203220196309\n",
      "✅ Evaluation for C_RES_500_3.keras completed.\n",
      "📦 Loading model: RES_500_3.keras\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "c:\\Users\\faola\\AppData\\Local\\Programs\\Python\\Python311\\Lib\\site-packages\\keras\\src\\saving\\saving_lib.py:757: UserWarning: Skipping variable loading for optimizer 'adamw', because it has 166 variables whereas the saved optimizer has 2 variables. \n",
      "  saveable.load_own_variables(weights_store.get(inner_path))\n"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "\u001b[1m339/339\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m15s\u001b[0m 40ms/step\n",
      "Classification Report RES_500_3.keras:\n",
      "              precision    recall  f1-score   support\n",
      "\n",
      "           0       0.12      0.27      0.17      1008\n",
      "           1       0.02      0.70      0.04       229\n",
      "           2       0.00      0.00      0.00       456\n",
      "           3       0.00      0.00      0.00      9141\n",
      "\n",
      "    accuracy                           0.04     10834\n",
      "   macro avg       0.04      0.24      0.05     10834\n",
      "weighted avg       0.01      0.04      0.02     10834\n",
      "\n",
      "AUC (RES_500_3.keras): 0.5395912383926311\n",
      "✅ Evaluation for RES_500_3.keras completed.\n",
      "📦 Loading model: RES_W500_L3.keras\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "c:\\Users\\faola\\AppData\\Local\\Programs\\Python\\Python311\\Lib\\site-packages\\sklearn\\metrics\\_classification.py:1565: UndefinedMetricWarning: Precision is ill-defined and being set to 0.0 in labels with no predicted samples. Use `zero_division` parameter to control this behavior.\n",
      "  _warn_prf(average, modifier, f\"{metric.capitalize()} is\", len(result))\n",
      "c:\\Users\\faola\\AppData\\Local\\Programs\\Python\\Python311\\Lib\\site-packages\\sklearn\\metrics\\_classification.py:1565: UndefinedMetricWarning: Precision is ill-defined and being set to 0.0 in labels with no predicted samples. Use `zero_division` parameter to control this behavior.\n",
      "  _warn_prf(average, modifier, f\"{metric.capitalize()} is\", len(result))\n",
      "c:\\Users\\faola\\AppData\\Local\\Programs\\Python\\Python311\\Lib\\site-packages\\sklearn\\metrics\\_classification.py:1565: UndefinedMetricWarning: Precision is ill-defined and being set to 0.0 in labels with no predicted samples. Use `zero_division` parameter to control this behavior.\n",
      "  _warn_prf(average, modifier, f\"{metric.capitalize()} is\", len(result))\n",
      "c:\\Users\\faola\\AppData\\Local\\Programs\\Python\\Python311\\Lib\\site-packages\\keras\\src\\saving\\saving_lib.py:757: UserWarning: Skipping variable loading for optimizer 'adam', because it has 86 variables whereas the saved optimizer has 2 variables. \n",
      "  saveable.load_own_variables(weights_store.get(inner_path))\n"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "\u001b[1m339/339\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m4s\u001b[0m 11ms/step\n",
      "Classification Report RES_W500_L3.keras:\n",
      "              precision    recall  f1-score   support\n",
      "\n",
      "           0       0.22      0.77      0.34      1008\n",
      "           1       0.16      0.68      0.26       229\n",
      "           2       0.24      0.85      0.37       456\n",
      "           3       1.00      0.50      0.67      9141\n",
      "\n",
      "    accuracy                           0.54     10834\n",
      "   macro avg       0.40      0.70      0.41     10834\n",
      "weighted avg       0.87      0.54      0.61     10834\n",
      "\n",
      "AUC (RES_W500_L3.keras): 0.8512434237223953\n",
      "✅ Evaluation for RES_W500_L3.keras completed.\n",
      "📦 Loading model: RES_W500_L3_9662ACC.keras\n",
      "\u001b[1m339/339\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m7s\u001b[0m 18ms/step\n",
      "Classification Report RES_W500_L3_9662ACC.keras:\n",
      "              precision    recall  f1-score   support\n",
      "\n",
      "           0       0.39      0.75      0.51      1008\n",
      "           1       0.30      0.85      0.45       229\n",
      "           2       0.24      0.93      0.38       456\n",
      "           3       0.99      0.70      0.82      9141\n",
      "\n",
      "    accuracy                           0.72     10834\n",
      "   macro avg       0.48      0.81      0.54     10834\n",
      "weighted avg       0.89      0.72      0.77     10834\n",
      "\n",
      "AUC (RES_W500_L3_9662ACC.keras): 0.9285605641960408\n",
      "✅ Evaluation for RES_W500_L3_9662ACC.keras completed.\n",
      "📦 Loading model: RES_W500_L3_9734.keras\n",
      "\u001b[1m339/339\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m7s\u001b[0m 19ms/step\n",
      "Classification Report RES_W500_L3_9734.keras:\n",
      "              precision    recall  f1-score   support\n",
      "\n",
      "           0       0.33      0.80      0.46      1008\n",
      "           1       0.30      0.81      0.44       229\n",
      "           2       0.22      0.97      0.36       456\n",
      "           3       1.00      0.63      0.77      9141\n",
      "\n",
      "    accuracy                           0.66     10834\n",
      "   macro avg       0.46      0.80      0.51     10834\n",
      "weighted avg       0.89      0.66      0.72     10834\n",
      "\n",
      "AUC (RES_W500_L3_9734.keras): 0.9246402756243796\n",
      "✅ Evaluation for RES_W500_L3_9734.keras completed.\n",
      "📦 Loading model: RES_W500_L4.keras\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "c:\\Users\\faola\\AppData\\Local\\Programs\\Python\\Python311\\Lib\\site-packages\\keras\\src\\saving\\saving_lib.py:757: UserWarning: Skipping variable loading for optimizer 'adam', because it has 110 variables whereas the saved optimizer has 2 variables. \n",
      "  saveable.load_own_variables(weights_store.get(inner_path))\n"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "\u001b[1m339/339\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m8s\u001b[0m 23ms/step\n",
      "Classification Report RES_W500_L4.keras:\n",
      "              precision    recall  f1-score   support\n",
      "\n",
      "           0       0.13      0.56      0.21      1008\n",
      "           1       0.17      0.98      0.29       229\n",
      "           2       0.22      0.74      0.34       456\n",
      "           3       1.00      0.40      0.57      9141\n",
      "\n",
      "    accuracy                           0.44     10834\n",
      "   macro avg       0.38      0.67      0.35     10834\n",
      "weighted avg       0.87      0.44      0.52     10834\n",
      "\n",
      "AUC (RES_W500_L4.keras): 0.8517034147482753\n",
      "✅ Evaluation for RES_W500_L4.keras completed.\n",
      "📦 Loading model: RES_W500_L4_FIXED.keras\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "c:\\Users\\faola\\AppData\\Local\\Programs\\Python\\Python311\\Lib\\site-packages\\keras\\src\\saving\\saving_lib.py:757: UserWarning: Skipping variable loading for optimizer 'adam', because it has 110 variables whereas the saved optimizer has 2 variables. \n",
      "  saveable.load_own_variables(weights_store.get(inner_path))\n"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "\u001b[1m339/339\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m14s\u001b[0m 41ms/step\n",
      "Classification Report RES_W500_L4_FIXED.keras:\n",
      "              precision    recall  f1-score   support\n",
      "\n",
      "           0       0.02      0.14      0.04      1008\n",
      "           1       0.04      0.99      0.09       229\n",
      "           2       0.25      0.00      0.01       456\n",
      "           3       1.00      0.01      0.02      9141\n",
      "\n",
      "    accuracy                           0.04     10834\n",
      "   macro avg       0.33      0.29      0.04     10834\n",
      "weighted avg       0.86      0.04      0.02     10834\n",
      "\n",
      "AUC (RES_W500_L4_FIXED.keras): 0.5618710260692796\n",
      "✅ Evaluation for RES_W500_L4_FIXED.keras completed.\n",
      "📦 Loading model: RES_W500_T03.keras\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "c:\\Users\\faola\\AppData\\Local\\Programs\\Python\\Python311\\Lib\\site-packages\\keras\\src\\saving\\saving_lib.py:757: UserWarning: Skipping variable loading for optimizer 'adam', because it has 174 variables whereas the saved optimizer has 2 variables. \n",
      "  saveable.load_own_variables(weights_store.get(inner_path))\n"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "\u001b[1m339/339\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m22s\u001b[0m 64ms/step\n",
      "Classification Report RES_W500_T03.keras:\n",
      "              precision    recall  f1-score   support\n",
      "\n",
      "           0       0.80      0.82      0.81      1008\n",
      "           1       0.31      0.98      0.47       229\n",
      "           2       0.23      1.00      0.37       456\n",
      "           3       1.00      0.77      0.87      9141\n",
      "\n",
      "    accuracy                           0.79     10834\n",
      "   macro avg       0.58      0.89      0.63     10834\n",
      "weighted avg       0.93      0.79      0.84     10834\n",
      "\n",
      "AUC (RES_W500_T03.keras): 0.9579597713970278\n",
      "✅ Evaluation for RES_W500_T03.keras completed.\n",
      "📦 Loading model: RES_L3_95ACC.h5\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "WARNING:absl:Compiled the loaded model, but the compiled metrics have yet to be built. `model.compile_metrics` will be empty until you train or evaluate the model.\n"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "\u001b[1m339/339\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m7s\u001b[0m 18ms/step\n",
      "Classification Report RES_L3_95ACC.h5:\n",
      "              precision    recall  f1-score   support\n",
      "\n",
      "           0       0.26      0.91      0.40      1008\n",
      "           1       0.23      0.61      0.33       229\n",
      "           2       0.16      0.81      0.27       456\n",
      "           3       1.00      0.48      0.65      9141\n",
      "\n",
      "    accuracy                           0.53     10834\n",
      "   macro avg       0.41      0.70      0.41     10834\n",
      "weighted avg       0.88      0.53      0.60     10834\n",
      "\n",
      "AUC (RES_L3_95ACC.h5): 0.8868072134127297\n",
      "✅ Evaluation for RES_L3_95ACC.h5 completed.\n",
      "📦 Loading model: RES_L3_9605ACC.h5\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "WARNING:absl:Compiled the loaded model, but the compiled metrics have yet to be built. `model.compile_metrics` will be empty until you train or evaluate the model.\n"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "\u001b[1m339/339\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m4s\u001b[0m 11ms/step\n",
      "Classification Report RES_L3_9605ACC.h5:\n",
      "              precision    recall  f1-score   support\n",
      "\n",
      "           0       0.25      0.77      0.37      1008\n",
      "           1       0.28      0.82      0.41       229\n",
      "           2       0.17      0.99      0.29       456\n",
      "           3       1.00      0.48      0.65      9141\n",
      "\n",
      "    accuracy                           0.53     10834\n",
      "   macro avg       0.42      0.76      0.43     10834\n",
      "weighted avg       0.88      0.53      0.60     10834\n",
      "\n",
      "AUC (RES_L3_9605ACC.h5): 0.9085592559987923\n",
      "✅ Evaluation for RES_L3_9605ACC.h5 completed.\n",
      "📦 Loading model: RES_W500_L4_97ACC.h5\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "WARNING:absl:Compiled the loaded model, but the compiled metrics have yet to be built. `model.compile_metrics` will be empty until you train or evaluate the model.\n"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "\u001b[1m339/339\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m6s\u001b[0m 17ms/step\n",
      "Classification Report RES_W500_L4_97ACC.h5:\n",
      "              precision    recall  f1-score   support\n",
      "\n",
      "           0       0.35      0.67      0.46      1008\n",
      "           1       0.22      0.97      0.36       229\n",
      "           2       0.28      0.93      0.43       456\n",
      "           3       0.99      0.69      0.82      9141\n",
      "\n",
      "    accuracy                           0.71     10834\n",
      "   macro avg       0.46      0.81      0.52     10834\n",
      "weighted avg       0.89      0.71      0.76     10834\n",
      "\n",
      "AUC (RES_W500_L4_97ACC.h5): 0.9103779956312803\n",
      "✅ Evaluation for RES_W500_L4_97ACC.h5 completed.\n",
      "📦 Loading model: RES_W500_T00.h5\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "WARNING:absl:Compiled the loaded model, but the compiled metrics have yet to be built. `model.compile_metrics` will be empty until you train or evaluate the model.\n"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "\u001b[1m339/339\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m2s\u001b[0m 5ms/step\n",
      "Classification Report RES_W500_T00.h5:\n",
      "              precision    recall  f1-score   support\n",
      "\n",
      "           0       0.33      0.65      0.44      1008\n",
      "           1       0.34      0.87      0.49       229\n",
      "           2       0.18      0.97      0.30       456\n",
      "           3       0.97      0.61      0.75      9141\n",
      "\n",
      "    accuracy                           0.63     10834\n",
      "   macro avg       0.45      0.78      0.49     10834\n",
      "weighted avg       0.86      0.63      0.70     10834\n",
      "\n",
      "AUC (RES_W500_T00.h5): 0.9078218703925129\n",
      "✅ Evaluation for RES_W500_T00.h5 completed.\n",
      "📦 Loading model: RES_W500_T01.h5\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "WARNING:absl:Compiled the loaded model, but the compiled metrics have yet to be built. `model.compile_metrics` will be empty until you train or evaluate the model.\n"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "\u001b[1m339/339\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m3s\u001b[0m 7ms/step\n",
      "Classification Report RES_W500_T01.h5:\n",
      "              precision    recall  f1-score   support\n",
      "\n",
      "           0       0.33      0.65      0.44      1008\n",
      "           1       0.34      0.87      0.49       229\n",
      "           2       0.18      0.97      0.30       456\n",
      "           3       0.97      0.61      0.75      9141\n",
      "\n",
      "    accuracy                           0.63     10834\n",
      "   macro avg       0.45      0.78      0.49     10834\n",
      "weighted avg       0.86      0.63      0.70     10834\n",
      "\n",
      "AUC (RES_W500_T01.h5): 0.9078218703925129\n",
      "✅ Evaluation for RES_W500_T01.h5 completed.\n",
      "📦 Loading model: RES_W500_T02.h5\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "WARNING:absl:Compiled the loaded model, but the compiled metrics have yet to be built. `model.compile_metrics` will be empty until you train or evaluate the model.\n"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "\u001b[1m339/339\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m2s\u001b[0m 5ms/step\n",
      "Classification Report RES_W500_T02.h5:\n",
      "              precision    recall  f1-score   support\n",
      "\n",
      "           0       0.33      0.65      0.44      1008\n",
      "           1       0.34      0.87      0.49       229\n",
      "           2       0.18      0.97      0.30       456\n",
      "           3       0.97      0.61      0.75      9141\n",
      "\n",
      "    accuracy                           0.63     10834\n",
      "   macro avg       0.45      0.78      0.49     10834\n",
      "weighted avg       0.86      0.63      0.70     10834\n",
      "\n",
      "AUC (RES_W500_T02.h5): 0.9078218703925129\n",
      "✅ Evaluation for RES_W500_T02.h5 completed.\n",
      "📦 Loading model: RES_W500_T04.h5\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "WARNING:absl:Compiled the loaded model, but the compiled metrics have yet to be built. `model.compile_metrics` will be empty until you train or evaluate the model.\n"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "\u001b[1m339/339\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m4s\u001b[0m 11ms/step\n",
      "Classification Report RES_W500_T04.h5:\n",
      "              precision    recall  f1-score   support\n",
      "\n",
      "           0       0.66      0.82      0.73      1008\n",
      "           1       0.28      0.97      0.44       229\n",
      "           2       0.26      0.95      0.40       456\n",
      "           3       1.00      0.77      0.87      9141\n",
      "\n",
      "    accuracy                           0.79     10834\n",
      "   macro avg       0.55      0.88      0.61     10834\n",
      "weighted avg       0.92      0.79      0.83     10834\n",
      "\n",
      "AUC (RES_W500_T04.h5): 0.9662301271787019\n",
      "✅ Evaluation for RES_W500_T04.h5 completed.\n"
     ]
    }
   ],
   "source": [
    "load_and_evaluate_models('src\\Models', X_test=norm_X, y_test=y_test)"
   ]
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.11.5"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 5
}
